命令内的环境

命令内的环境

我的代码

\documentclass[a4paper,12pt,twoside]{article}
\usepackage[english]{babel}
\usepackage{amssymb}
\usepackage{amsmath}

\newcommand{\QUE}[1]{%
{\bf Question\# 1 }: #1
}%end QUE

\raggedbottom

\begin{document}

\section{Algorithms and data structures} 

\QUE{Given the following C function definition:
\begin{verbatim}
int foo(int a, int b){
  if (a == b)
    return a;
  else
    return (a>b) ? foo(a-b, b) : foo(a, b-a);
}
\end{verbatim}
What is the result of the computation of \texttt{foo(24, 16)}?
}

\smallskip\hrule\smallskip

\end{document}

生成:

[...]
Runaway argument?
 int foo(int a, int b){ if (a == b) return a; else return (a>b) ? foo\ETC.
! File ended while scanning use of \@xverbatim.
<inserted text> 
                \par 
l.74 \input{Q0201}
etc. 

如果我注释掉\begin{verbatim}...\end{verbatim}代码,代码就会运行。其他的也存在同样的问题,\begin{something}...\end{something} 有什么提示吗?

答案1

https://texfaq.org/FAQ-verbwithin

LaTeX verbatim 命令通过更改类别代码来工作。Knuth 谈到这种事情时说“需要小心把握时机……”,因为一旦将类别代码分配给字符,它就不会改变。因此 \verb 和 \begin{verbatim} 必须假设它们首先查看参数文本;如果不是,则 TeX 已经分配了类别代码,因此 verbatim 命令没有机会。例如:

\verb+\error+

可以工作(排版' \error'),但是

\newcommand{\unbrace}[1]{#1}
\unbrace{\verb+\error+}

不会(它将尝试执行\error)。可能遇到的其他错误是“\verb 结束于行尾”,或者甚至更有帮助的“\verb命令参数非法”。同样的事情发生在\begin{verbatim}…… \end{verbatim}

\ifthenelse{\boolean{foo}}{%`
\begin{verbatim}
foobar
\end{verbatim}
}{%
\begin{verbatim}
barfoo
\end{verbatim}
}

引发诸如‘扫描使用时文件结束\@xverbatim’之类的错误,因为\begin{verbatim}无法看到其匹配\end{verbatim}

这就是为什么 LaTeX 手册坚持逐字命令不得出现在任何其他命令的参数中;它们不仅脆弱,而且在任何“正常”命令参数中都完全无法使用,无论 \protection 如何。(\verb 命令会尽力检测您是否误用了它;不幸的是,它不能总是这样做,因此错误消息不能可靠地指示问题。)

因此,您要问自己的第一个问题是:“\verb真的有必要吗?”

If `\texttt{your text}` produces the same result as `\verb+your text+`,

那么就不需要\verb in第一个了。如果您使用\verb来排版 URL 或电子邮件地址等,那么包\url中的命令url会有所帮助:它不会遭受 的所有问题\verb,尽管它仍然不够强大。如果您将其放入\verb装箱命令的参数中(例如 \fbox),请考虑使用lrbox环境:

    `\newsavebox{\mybox}`
    ...
    `\begin{lrbox}{\mybox}`
      `\verb!VerbatimStuff!`
    `\end{lrbox}`
    `\fbox{\usebox{\mybox}}`

[等等。更多信息请见顶部的网页]

答案2

\# 1我对代码中的有很大的怀疑,也许你想要在之前有一些空间,也许1应该是一些计数器的值,无论如何,你可以\QUE通过以下方式拯救命令:(正如在浪费空间的答案,不能将逐字逐句地放在将作为命令参数的内容中,因此这里的技巧是\QUE没有参数)

\documentclass[a4paper,12pt,twoside]{article}
\usepackage[english]{babel}
\usepackage{amssymb}
\usepackage{amsmath}

% \newcommand{\QUE}[1]{%
% {\bf Question\# 1 }: #1
% }%end QUE

\newcommand{\QUE}{\textbf {Question\# 1}: \bgroup\let\next=}%

\raggedbottom

\begin{document}\thispagestyle{empty}

\section{Algorithms and data structures} 

\QUE{Given the following C function definition:
\begin{verbatim}
int foo(int a, int b){
  if (a == b)
    return a;
  else
    return (a>b) ? foo(a-b, b) : foo(a, b-a);
}
\end{verbatim}
What is the result of the computation of \texttt{foo(24, 16)}?
}

\smallskip\hrule\smallskip

\end{document}

逐字“in”命令

相关内容