为什么这个错误会出现在这个例子中?!不完整的 \iffalse;行后的所有文本都被忽略

为什么这个错误会出现在这个例子中?!不完整的 \iffalse;行后的所有文本都被忽略

我不明白为什么下面这个例子中会出现这个错误。

当我\iffalse注释掉一个部分时,如果\cprotect其周围有注释,则会出现错误。删除注释后\iffalse,错误消失。

\documentclass{article}%
\usepackage{amsmath}
\usepackage{cprotect}
\begin{document}

\iffalse
\cprotect\section{my title with some math $\sin x$}
    this is a test
\fi

test
\end{document}

使用编译时lualatex foo3.tex出现错误

(./foo3.aux) (/usr/local/texlive/2020/texmf-dist/tex/latex/base/ts1cmr.fd)
! Incomplete \iffalse; all text was ignored after line 8.
<inserted text>
\fi
l.9 \cprotect
           \section{my title with some math $\sin x$}
?

删除 \usepackage{cprotect}错误就会消失。同样,保留\usepackage{cprotect}但删除\iffalse,错误就会消失。

为什么会发生这种情况?如何保留注释掉的部分,但仍按cprotect我的需要将其用于文件中的其他部分?

TL 2020

lualatex --version
This is LuaHBTeX, Version 1.12.0 (TeX Live 2020)

答案1

用作\iffalse ... \fi注释掉代码块的方法似乎不是一种完全健全的方法。

要真正注释掉代码,您可以将%(注释)符号放在每行感兴趣的代码的开头。或者,您可以加载包,并用和语句comment将相关代码块单独放在一行中。\begin{comment}\end{comment}

\documentclass{article}
\usepackage{amsmath,cprotect,comment}
\begin{document}

\begin{comment}
\cprotect\section{my title with some math $\sin x$}
    this is a test
\end{comment}

test
\end{document}

答案2

不幸的是,\cprotect被定义为\outer完全无用的 TeX 原始功能,在 LaTeX 中根本用不到。将命令声明为的唯一效果\outer是使其在某些被视为非“顶级”的构造中抛出错误,并且测试跳过的区域\if是不允许的上下文之一。

\outer是一种错误检测机制,它产生的错误比它检测到的错误多几个数量级。

由于您正在使用 luatex,您可以使用 禁用整个机制\suppressoutererror

\documentclass{article}%
\usepackage{amsmath}
\usepackage{cprotect}

\suppressoutererror = 1

\begin{document}


\iffalse
\cprotect\section{my title with some math $\sin x$}
    this is a test
\fi

test
\end{document}

或者,该包提供了\icprotect该命令的非外部版本。

\documentclass{article}%
\usepackage{amsmath}
\usepackage{cprotect}

%\suppressoutererror = 1

\begin{document}


\iffalse
\icprotect\section{my title with some math $\sin x$}
    this is a test
\fi

test
\end{document}

相关内容