使用 LaTeX 3 的包定义中出现未知错误

使用 LaTeX 3 的包定义中出现未知错误

我正在尝试包括一个不错的 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}
 {}%

相关内容