如果自定义类位于子文件夹中,选项将不起作用

如果自定义类位于子文件夹中,选项将不起作用

我创建了自己的 LaTeX 模板,并为此使用了自定义类。我在 Windows 机器上使用 TeX Live 2020 开发了模板,最近在 Mac 上编译了该项目的副本。但是,在装有 MacTeX 2020 的 Mac 上,出现了错误,我可以追溯到选项不起作用。进一步尝试找出问题所在,结果表明,只有当类位于子文件夹中时,选项才不起作用。如果它位于根目录中,那么它就可以正常工作。我还注意到,只有在使用本机 LaTeX 编译器时才会发生错误。在 Texpad 中不会发生错误。

以下文件应以最小示例来说明错误。对于所有由于系统要求而无法自行运行的人,我展示了各个文档生成步骤的输出。


testclass.clstestfolder/testclass.cls

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{testclass}[testclass]
\LoadClass{article}

\newif\if@testOpion
\@testOpiontrue

\DeclareOption{optionTrue}{\@testOpiontrue}
\DeclareOption{optionFalse}{\@testOpionfalse}

\ExecuteOptions{optionTrue}

\ProcessOptions\relax

\newcommand{\printtestresult}{}
\if@testOpion
    \renewcommand{\printtestresult}{true}
\else
    \renewcommand{\printtestresult}{false}
\fi

\endinput

test.tex

\documentclass[optionFalse]{testclass} % works
% \documentclass[optionFalse]{testfolder/testclass} % does not work

\begin{document}
   \texttt{testOption} is set to \texttt{\printtestresult}
\end{document}

项目结构

test_project
├── test.tex
├── testclass.cls
└── testfolder
    └── testclass.cls

当创建文档时,\documentclass[optionFalse]{testclass}我得到以下输出:

  • 视窗:
    • testOption被设定为false
  • 苹果:
    • 泰克帕德:
      • testOption被设定为false
    • 本机编译器:
      • testOption被设定为false

但是,如果我使用嵌套类\documentclass[optionFalse]{testfolder/testclass},则会发生以下情况:

  • Windows(本机):
    • testOption被设定为false
  • 苹果
    • 泰克帕德:
      • testOption被设定为false
    • 本机编译器:
      • testOption被设定为true

如果我忘记了任何重要信息,请随时询问更多信息。我发现很难清楚地解释这个错误,因为它对我来说并不是真正有形的。不过,我可以说的是,同样的错误也发生在朋友的全新 Mac 上,它上面安装了全新的 MaxTeX。所以这似乎不是我的发行版的问题。

答案1

正如 LaTeX 项目团队成员在评论中指出的那样,从子文件夹内调用类并不是有意支持的功能。在将 LaTeX 更新到 2020-10-01 版本的过程中,此功能已丢失。GitHub 问题早在 10 月 31 日就指出了这个问题,并且一个错误修复被合并到修补程序 gh422为了兼容性。但是,由于在本文发布时此修补程序尚未通过 LaTeX 更新提供,因此我尝试了上述 GitHub 问题中也推荐的解决方法。

实际上,告诉 LaTeX 文档中可以搜索文件的文件夹是可行的。这样做的好处是您不必通过 TEXINPUTS 在每个文档的 PATH 变量中设置此特定文件夹。您所要做的就是在文档中的第一个代码中执行以下代码片段,以便 LaTeX 知道包含该类的子文件夹。

\makeatletter
   \def\input@path{{./style}}
\makeatother

使用我最初的例子,正确的用法如下:

改成test.tex

\makeatletter
   \def\input@path{{./testfolder}}
\makeatother

\documentclass[optionFalse]{testclass}

\begin{document}
   \texttt{testOption} is set to \texttt{\printtestresult}
\end{document}

这样,LaTeX 还将在./testfolder目录中搜索名为的类testclass

相关内容