diff --git a/docs/guides/feature-flags.rst b/docs/guides/feature-flags.rst index 91ba814356b..6bc175f8a57 100644 --- a/docs/guides/feature-flags.rst +++ b/docs/guides/feature-flags.rst @@ -16,6 +16,12 @@ Available Flags ``USE_SETUPTOOLS_LATEST``: :featureflags:`USE_SETUPTOOLS_LATEST` +``USE_XELATEX_BINARY``: :featureflags:`USE_XELATEX_BINARY` + +``USE_LUALATEX_BINARY``: :featureflags:`USE_LUALATEX_BINARY` + +``USE_PLATEX_BINARY``: :featureflags:`USE_PLATEX_BINARY` + ``ALLOW_DEPRECATED_WEBHOOKS``: :featureflags:`ALLOW_DEPRECATED_WEBHOOKS` ``PIP_ALWAYS_UPGRADE``: :featureflags:`PIP_ALWAYS_UPGRADE` diff --git a/readthedocs/doc_builder/backends/sphinx.py b/readthedocs/doc_builder/backends/sphinx.py index c5a664835fa..ecf4704121c 100644 --- a/readthedocs/doc_builder/backends/sphinx.py +++ b/readthedocs/doc_builder/backends/sphinx.py @@ -392,13 +392,33 @@ def build(self): raise BuildEnvironmentError('No TeX files were found') # Run LaTeX -> PDF conversions - pdflatex_cmds = [ - ['pdflatex', '-interaction=nonstopmode', tex_file] + # https://github.com/rtfd/readthedocs.org/issues/4454 + if self.project.has_feature(Feature.USE_XELATEX_BINARY): + latex_cmd = 'xelatex' + makeindex_cmd = 'xindy' + elif self.project.has_feature(Feature.USE_LUALATEX_BINARY): + latex_cmd = 'lualatex' + makeindex_cmd = 'xindy' + elif self.project.has_feature(Feature.USE_PLATEX_BINARY): + latex_cmd = 'platex' + makeindex_cmd = 'xindy' + else: + latex_cmd = 'pdflatex' + makeindex_cmd = 'makeindex' + + latex_cmds = [ + [latex_cmd, '-interaction=nonstopmode', tex_file] for tex_file in tex_files ] # yapf: disable + + if makeindex_cmd == 'xindy': + makeindex_args = ['-C', 'utf8', '-M', 'texindy'] + else: + makeindex_args = ['-s', 'python.ist'] + makeindex_cmds = [ [ - 'makeindex', '-s', 'python.ist', '{}.idx'.format( + makeindex_cmd, *makeindex_args, '{}.idx'.format( os.path.splitext(os.path.relpath(tex_file, latex_cwd))[0], ), ] @@ -410,7 +430,7 @@ def build(self): else: latex_class = LatexBuildCommand pdf_commands = [] - for cmd in pdflatex_cmds: + for cmd in latex_cmds: cmd_ret = self.build_env.run_command_class( cls=latex_class, cmd=cmd, @@ -426,7 +446,7 @@ def build(self): warn_only=True, ) pdf_commands.append(cmd_ret) - for cmd in pdflatex_cmds: + for cmd in latex_cmds: cmd_ret = self.build_env.run_command_class( cls=latex_class, cmd=cmd, diff --git a/readthedocs/projects/models.py b/readthedocs/projects/models.py index 5991a41bb14..0a2e7452ece 100644 --- a/readthedocs/projects/models.py +++ b/readthedocs/projects/models.py @@ -1313,12 +1313,18 @@ def add_features(sender, **kwargs): API_LARGE_DATA = 'api_large_data' DONT_SHALLOW_CLONE = 'dont_shallow_clone' USE_TESTING_BUILD_IMAGE = 'use_testing_build_image' + USE_XELATEX_BINARY = 'use_xelatex_binary' + USE_LUALATEX_BINARY = 'use_lualatex_binary' + USE_PLATEX_BINARY = 'use_platex_binary' FEATURES = ( (USE_SPHINX_LATEST, _('Use latest version of Sphinx')), (USE_SETUPTOOLS_LATEST, _('Use latest version of setuptools')), (ALLOW_DEPRECATED_WEBHOOKS, _('Allow deprecated webhook views')), (PIP_ALWAYS_UPGRADE, _('Always run pip install --upgrade')), + (USE_XELATEX_BINARY, _('Use "xelatex" binary to build PDF files')), + (USE_LUALATEX_BINARY, _('Use "lualatex" binary to build PDF files')), + (USE_PLATEX_BINARY, _('Use "platex" binary to build PDF files')), (SKIP_SUBMODULES, _('Skip git submodule checkout')), ( DONT_OVERWRITE_SPHINX_CONTEXT, _( @@ -1337,7 +1343,7 @@ def add_features(sender, **kwargs): _( 'Use Docker image labelled as `testing` to build the docs', ), - ), (API_LARGE_DATA, _('Try alternative method of posting large data')) + ), (API_LARGE_DATA, _('Try alternative method of posting large data')), ) projects = models.ManyToManyField(