我创建了自己的 LaTeX 模板,并为此使用了自定义类。我在 Windows 机器上使用 TeX Live 2020 开发了模板,最近在 Mac 上编译了该项目的副本。但是,在装有 MacTeX 2020 的 Mac 上,出现了错误,我可以追溯到选项不起作用。进一步尝试找出问题所在,结果表明,只有当类位于子文件夹中时,选项才不起作用。如果它位于根目录中,那么它就可以正常工作。我还注意到,只有在使用本机 LaTeX 编译器时才会发生错误。在 Texpad 中不会发生错误。
以下文件应以最小示例来说明错误。对于所有由于系统要求而无法自行运行的人,我展示了各个文档生成步骤的输出。
testclass.cls
和testfolder/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
。