注释掉 lineno 并通过 ltxcmds 禁用与其相关的命令会导致编译失败,除非我手动删除 aux 文件

注释掉 lineno 并通过 ltxcmds 禁用与其相关的命令会导致编译失败,除非我手动删除 aux 文件

先前的问题,举个例子

\documentclass{book}

\usepackage{lipsum}

\usepackage[left, pagewise]{lineno} % LINE
\usepackage{ltxcmds}

\makeatletter
\newcommand{\OnlyIfPackageLoaded}[2]{\ltx@ifpackageloaded{#1}{#2}{}}
\makeatother

\makeatletter
\OnlyIfPackageLoaded{lineno}{
\def\makeLineNumberLeft{%
  \linenumberfont\llap{\hb@xt@\linenumberwidth{\LineNumber\hss}\hskip\linenumbersep}% left line number
  \hskip\columnwidth% skip over column of text
  \rlap{\hskip\linenumbersep\hb@xt@\linenumberwidth{\hss\LineNumber}}\hss}% right line number
\leftlinenumbers% Re-issue [left] option
}
\makeatother

\begin{document}

\OnlyIfPackageLoaded{lineno}{\linenumbers}

\lipsum[1]

\end{document}

如果我注释掉它的,则\OnlyIfPackageLoaded用于使相关的东西消失。lineno\usepackage

很遗憾:

  • 如果我从一个干净的目录进行编译并且THAT行注释,则编译成功;
  • 如果我取消THAT注释行并重新编译,则编译成功;
  • 如果我重新注释THAT行并重新编译,编译将失败:
    ...
    (./main.aux
    ! Undefined control sequence.
    l.2 \@LN
            {0}{0}
    ? 
    
  • 如果我删除该.aux文件并重新编译,则编译成功。

lineno当我从有-转到无- 时,我该怎么做才能避免手动删除 AUX 文件lineno

答案1

您只需要不隐藏 else 分支,\@ifpackageloaded这样您就可以定义 aux 命令不执行任何操作。(ltxcmds这里不执行任何操作,因为这一切都已经是乳胶了)

\documentclass{book}

\usepackage{lipsum}

\usepackage[left, pagewise]{lineno} % LINE
% not useful here \usepackage{ltxcmds}

\makeatletter
\newcommand{\OnlyIfPackageLoadedTF}{\@ifpackageloaded}
\newcommand{\OnlyIfPackageLoadedT}[2]{\@ifpackageloaded{#1}{#2}{}}
\makeatother

\makeatletter
\OnlyIfPackageLoadedTF{lineno}{
\def\makeLineNumberLeft{%
  \linenumberfont\llap{\hb@xt@\linenumberwidth{\LineNumber\hss}\hskip\linenumbersep}% left line number
  \hskip\columnwidth% skip over column of text
  \rlap{\hskip\linenumbersep\hb@xt@\linenumberwidth{\hss\LineNumber}}\hss}% right line number
\leftlinenumbers% Re-issue [left] option
}
% else
{
\def\@LN#1#2{}
}
\makeatother

\begin{document}

\OnlyIfPackageLoadedT{lineno}{\linenumbers}

\lipsum[1]

\end{document}

相关内容