註解掉 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}

如果我註解掉它,則where\OnlyIfPackageLoaded用於使相關的東西消失。lineno\usepackage

很遺憾:

  • 如果我從一個帶有THAT註解行的乾淨目錄進行編譯,則編譯成功;
  • 如果我取消THAT註解行並重新編譯,則編譯成功;
  • 如果我重新註解THAT行並重新編譯,編譯將失敗:
    ...
    (./main.aux
    ! Undefined control sequence.
    l.2 \@LN
            {0}{0}
    ? 
    
  • 如果我刪除該.aux檔案並重新編譯,則編譯成功。

lineno當我從 with- 轉為without- 時,如何避免手動刪除 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}

相關內容