“失控的参数?”仅在 \input 文件中

“失控的参数?”仅在 \input 文件中

更新:根据 @egreg 的建议,下面显示的情况是问题的核心,与语句无关include/input。我有一个verbatimwithintoggle语句,它失败了。一个最小代码是

\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

仅有的失败的情况是如果我有verbatimtoggles我对乳胶还比较陌生,我不确定这是否是一个明显的错误。有人能指出这个问题的正确方法/解决方法吗?另外,为什么会出现这个错误?

答案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时做一些不同的事情即可。verbatimlstlisting

\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

相关内容