我想测试是否inputenc
已selinput
加载。我现在的问题是执行复杂的布尔表达式,但我不知道如何使用 LaTeX 执行此操作。
基本代码如下:
\AtBeginDocument{%
\ifpdftex{% only if pdftex
\ifthenelse{%
\not\isPackageLoaded{inputenc} \and \not\isPackageLoaded{selinput}
}%
{ raise warning }
{ everything ok }
}{}
}
然而我认为 \not 和 \and 等不能直接使用。
测试代码基于此(未经全面测试)
\RequirePackage{scrlfile, etoolbox}%
\SetupIfPackageLoaded{inputenc}
\SetupIfPackageLoaded{selinput}
\newcommand\SetupIfPackageLoaded[1]{%
\providebool{TemplateIfPackageLoaded@#1}
\setboolean{TemplateIfPackageLoaded@#1}{false}
\AfterPackage{#1}{%
\setboolean{TemplateIfPackageLoaded@#1}{true}
}%
}%
\newcommand\isPackageLoaded[1]{%
\boolean{TemplateIfPackageLoaded@#1}
}
该代码是一个包,我想使用它来测试 LaTeX 模板中的错误(主要在序言中)。
答案1
纯 LaTeX 溶液
纯 LaTeX 内核解决方案可以使用\@ifpackageloaded
和\if@tempswa
(临时条件):
\ifPDFTeX
\@tempswafalse % initialize
\@ifpackageloaded{inputenc}{\@tempswatrue}{}
\@ifpackageloaded{selinput}{\@tempswatrue}{}
\if@tempswa
<OK>
\else
<ERROR>
\fi
\fi
\ifPDFTeX
由国际纺织展览会包。你不能检查只有一个的软件包已加载,因为塞林普特负载输入,因此这个特定的测试可以简化为
\ifPDFTeX
\@ifpackageloaded{inputenc}{<OK>}{<ERROR>}
\fi
但我想阐明一种更普遍的机制。
只有一个 scratch 条件,但没有什么可以阻止你定义自己的
\newif\if@tempswb
\newif\if@tempswc
如果需要进行更复杂的检查。
解决方案西弗森
包裹坐标在定义时加载。因此我们可以为\[email protected]
西弗森:
\usepackage{xifthen}
\newcommand\isnotloaded[1]{%
\expandafter\isundefined\csname ver@#1.sty\endcsname}
然后
\ifthenelse{\isnotloaded{inputenc}\AND\isnotloaded{selinput}}
{<ERROR>}
{<OK>}
应该可以工作(当然这只是一个例子)。请参阅西弗森更多细节。
解决方案电子工具箱
\usepackage{etoolbox}
\newcommand\ifisloaded[1]{\ifcsdef{ver@#1.sty}}
\ifboolexpr{ test {\ifisloaded{inputenc}} or test {\ifisloaded{selinput}} }
{<OK>}
{<ERROR>}
笔记
我相信解决方案是电子工具箱是更稳健的。还要记住丰滕克将自身从已加载包的列表中隐藏起来,并且无法使用此方法测试其加载情况。
答案2
现在可以正常工作了,包的输出是这个错误:
Package templatebugs Warning:
(templatebugs) You have not loaded Package: 'inputenc'
(templatebugs) This Package is recommanded. It is used for:
(templatebugs) Character translation to LaTeX internals. You
(templatebugs) can not use umlaute and other language specific
(templatebugs) special characters without this package.
(templatebugs)
(templatebugs) Alternatively use package selinput.
(templatebugs) on input line 282.
基于此代码(已剥离)
\SetupIfPackageLoaded{inputenc}
\AtBeginDocument{%
\ifpdftex{% only if pdftex
\IfPackageNotLoaded{inputenc}{%
\WarnBasicPackageNotLoaded{inputenc}{%
Character translation to LaTeX internals. You \MessageBreak
can not use umlaute and other language specific \MessageBreak
special characters without this package. \MessageBreak
\MessageBreak
Alternatively use package selinput. \MessageBreak
}%
}%
}{}
}%
这里讨论的代码不再需要,因为无论如何selinput
都会加载inputenc
。但对于进一步的工作,了解如何处理此类布尔表达式是值得的。