我正在尝试包括一个不错的 LaTeX 代码片段(适当记入)在我的默认类中。但由于它是在几个不同的系统上编译的,因此我希望有这么小的错误处理代码,以防某个包或其他包不可用。
由于我对 LaTeX 3 没有经验,我无法看出这里有 LaTeX 3 代码,而且问题可能出在那里:
\IfFileExists{expl3.sty}{%
\IfFileExists{etoolbox.sty}{%
%% requires LaTeX3 dependencies
\RequirePackage{expl3}
\ExplSyntaxOn
\prop_new:N \g_cite_map_prop
\tl_new:N \l_citekey_result_tl
\cs_new:Npn \mapcitekey #1#2 {
\clist_map_inline:nn {#2}
{ \prop_gput:Nnn \g_cite_map_prop {##1} {#1} }
}
\cs_new:Npn \getcitekey #1 {
\prop_get:NoN \g_cite_map_prop{#1} \l_citekey_result_tl
\quark_if_no_value:NF \l_citekey_result_tl
{ \tl_set_eq:NN #1 \l_citekey_result_tl }
}
\cs_new:Npn \showcitekeymaps {\prop_show:N \g_cite_map_prop }
\ExplSyntaxOff
%% patch citation commands
\RequirePackage{etoolbox}
\makeatletter
\patchcmd{\@citex}{\if@filesw}{\getcitekey\@citeb \if@filesw}%
{\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}
\patchcmd{\nocite}{\if@filesw}{\getcitekey\@citeb \if@filesw}%
{\typeout{*** SUCCESS ***}}{\typeout{*** FAIL ***}}
\makeatletter
%% info message
\PackageInfo{mapcitekey-package}{%
``mapcitekey'' patched cite and nocite.\MessageBreak
If you use another citation package (such as natbib),
in conjunction with ``mapcitekey'', you must also patch
their citation command.\MessageBreak
}
}{%
\PackageWarning{mapcitekey-package}{%
``etoolbox'' is not available.\MessageBreak
Cannot patch the citation commands for ``mapcitekey''\MessageBreak
}%
}%
}{%
\PackageWarning{mapcitekey-package}{%
LaTeX 3 is not available.\MessageBreak
Cannot properly define the ``mapcitekey'' macro.\MessageBreak
Attempt to define a bogus ``mapcitekey'' command.\MessageBreak
}%
\newcommand{\mapcitekey}[2]{}
}% ERRORLINE
我现在收到的错误消息是:
ERROR: Incomplete \ifeof; all text was ignored after line ERRORLINE.
但整个块有很多问题我搞不清楚。我不确定问题出在 IfFileExists 块上,还是使用 LaTeX 3 代码,还是修补 cite 和 nocite。
我该如何调整它以便可以编译?
答案1
\IfFileExists
是一个带有 3 个参数的命令:
\long\def \IfFileExists#1#2#3 ....
这意味着您首先无法将参数内部的 expl3 catcodes 更改为 expl3 catcodes。两者都不\ExplSyntaxOn
是\makeatletter
您所期望的,因为您可以轻松测试:
\documentclass{article}
\usepackage{expl3}
\IfFileExists{expl3.sty}{%
\ExplSyntaxOn
\prop_new:N \g_cite_map_prop
\ExplSyntaxOff
}{}%
\begin{document}
blub
\end{document}
其次,这意味着代码中的 #1 和 #2 是指的参数\IfFileExists
,因此您要重新插入它们——我并不是想知道接下来会发生什么,但它爆炸真的并不奇怪。
将大量复杂的代码放在这样的论点中并不是一个好主意。如果你真的认为这样的测试是必要的,那么最好将其移动到一些外部样式或一些外部命令,然后执行类似
\IfFileExists{expl3.sty}
{\RequirePackage{my-expl-3-code}}
{}%
或者
\IfFileExists{expl3.sty}
{\mapcitekey@patchcitex}
{}%