更新:根据 @egreg 的建议,下面显示的情况是问题的核心,与语句无关include/input
。我有一个verbatim
withintoggle
语句,它失败了。一个最小代码是
\documentclass[openany]{book}
\usepackage{etoolbox}
\newtoggle{tog1}
\toggletrue{tog1}
\begin{document}
\iftoggle{tog1} {
\begin{verbatim}
Hello World!
\end{verbatim}
} {
\textit{Hello World}
}
\end{document}
总结我有切换案例,其中我有逐字记录,这导致
“失控的争论”逐字内容!扫描 \@xverbatim 的使用时文件结束。
我有一个特殊的情况。我有一个 latex 项目,其目录结构如下
[project_home]
- main.tex
- [tex]
- [folder_1]
- chapter_1.tex
- chapter_1_sec_1.tex
- [folder_2]
- chapter_2.tex
- chapter_2_sec_1.tex
- [img]
<image files>
该main.tex
文件包含包含语句,用于包含来自 tex 文件夹的文件(它们属于各个章节)。
主文本
\documentclass{book}
\newtoggle{tog1}
\toggletrue{tog1}
..
\begin{document}
\include{tex/folder_1/chapter_1}
\include{tex/folder_2/chapter_2}
..
\end{document}
在每一章中,我都有许多章节。我将这些单独的章节文件包含在其中chapter.tex
,其中一些章节文件有切换语句(电子工具箱)。
第 1 章.tex
\chapter{chapter 1}
\section{section 1}
\input{chapter_1_sec_1.tex}
..
\section{section 2}
..
第1章第1节.tex
\iftoggle{tog1} {
\begin{verbatim}
% some HTML code
\end{verbatim}
} {
% The else part
% No verbatim here, just plain tex text
}
现在,包含\verbatim
或\lstlisting
包含在这些切换情况中,构建会失败并出现上述错误。
注1:如果我删除切换案例,构建将不会失败。当我删除案例并只包含文件中的内容时, verbatim
/lstlisting
工作正常。toggle
笔记2:verbatim
如果我删除/lstlisting
部分并有案例,它就会起作用toggle
。
我尝试将内容chapter_1_sec_1.tex
直接包含在chapter_1.tex
文件中,而不使用切换案例。因此,嵌套文件似乎没有问题include/input
。
这仅有的失败的情况是如果我有verbatim
。toggles
我对乳胶还比较陌生,我不确定这是否是一个明显的错误。有人能指出这个问题的正确方法/解决方法吗?另外,为什么会出现这个错误?
答案1
verbatim
内容当前被用作参数\iftoggle{<toggle>}{<true>}{<false>}
- 无论是在子句中还是在<true>
子句中<false>
。您不能将verbatim
内容作为宏的参数,因为读取的参数修复了类别代码,而类别代码verbatim
需要更改。
一个建议是使用传统的 TeX \if
:
\newif\iftogA
\togAtrue% Set toggle togA to true
然后进入chapter_1_sec_1.tex
\iftogA
\begin{verbatim}
% some HTML code
\end{verbatim}
\else
% The else part
% No verbatim here, just plain TeX text
\fi
这是一个强调其用途的简单示例:
\documentclass{article}
\newif\iftogA
\begin{document}
\togAtrue% Set toggle togA to true
\iftogA
\begin{verbatim}
Some verbatim text.
\end{verbatim}
\else
Some regular text.
\fi
\togAfalse% Set toggle togA to false
\iftogA
\begin{verbatim}
Some verbatim text.
\end{verbatim}
\else
Some regular text.
\fi
\end{document}
问题中未涉及的一个问题是您的verbatim
环境缩进。请注意,前导空格按原样设置verbatim
(和listings
),所以通常建议避免这种情况(正如我上面所做的那样)。
答案2
verbatim
或命令lstlisting
不能作为另一个命令的参数。
\newtoggle
您可以保留与的界面,只要在涉及或\iftoggle
时做一些不同的事情即可。verbatim
lstlisting
\documentclass{article}
\usepackage{etoolbox}
\newtoggle{tog1}
\newcommand{\verbatimtoggle}[1]{%
TT\fi
\iftoggle{#1}{\iftrue}{\iffalse}%
}
\begin{document}
\togglefalse{tog1}
\iftoggle{tog1}{TRUE}{FALSE}
\if\verbatimtoggle{tog1}
\begin{verbatim}
This is verbatim
\end{verbatim}
\fi
\toggletrue{tog1}
\iftoggle{tog1}{TRUE}{FALSE}
\if\verbatimtoggle{tog1}
\begin{verbatim}
This is verbatim
\end{verbatim}
\fi
\end{document}
您还可以使用\else
分支:
\if\verbatimtoggle{tog1}
<true text>
\else
<false text>
\fi