我不明白为什么下面这个例子中会出现这个错误。
当我\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}