我对 LaTeX 的计算非常困惑。我尝试定义一个环境,它可以通过我自由提供的整数参数来更改其排版。我选择\ifcase
并尝试了以下方法:
\documentclass{article}
\newcounter{numexm}[section]
\setcounter{numexm}{0}
\renewcommand\thenumexm{\roman{numexm}}
%\newcounter{first}
%\setcounter{first}{1}
\newenvironment{ntexmC}[5][0]{
\newcommand\makechoice{%
\ifcase\value{#1}%
\relax\or %
A. #2 \hfill B. #3 \hfill
C. #4 \hfill D. #5\or %
A. #2\hspace{\stretch{2}} B. #3\hspace{\stretch{3}}\par
C. #4\hspace{\stretch{2}} D. #5\hspace{\stretch{3}}\or %
A. #2\par B. #3\par C. #4\par D. #5\else %
\relax \fi
}%
\addvspace{.2em}\stepcounter{numexm}
\setlength\parindent{0em} Example \thenumexm.
}{\par\makechoice\addvspace{.2em}}
\begin{document}
\section{One}
\begin{ntexmC}[1]{AAAAAAA}{BBBBBBB}{CCCCCCC}{DDDDDDD}% replace 1 with first
The title (\hspace{1em})
\end{ntexmC}
\end{document}
我用它编译后pdflatex
,出现错误:
Missing number, treated as zero.
<to be read again>
所以我尝试使用另一个计数器来表示整数。我将first
其定义并设置为1
(在上面注释中),然后用计数器替换第一个参数。出现另一个错误:
Something's wrong--perhaps a missing \item.
然而,输出正是我所期望的。
所以第一个问题是我是否可以像第一个例子一样直接使用整数来切换选项?
第二个问题是第二次尝试出了什么问题?
如果还有其他工具可以实现我的期望,请顺便告诉我,这将非常有帮助。谢谢!
答案1
\ifcase <num> ... \fi
期望 为整数<num>
。如果传递整数,请按原样使用它,而不是\value{#1}
。
\documentclass{article}
\newcounter{numexm}[section]
\setcounter{numexm}{0}
\renewcommand\thenumexm{\roman{numexm}}
\newenvironment{ntexmC}[5][0]{
\newcommand\makechoice{%
\ifcase#1%
\relax\or % 0
A. #2 \hfill B. #3 \hfill C. #4 \hfill D. #5\or % 1
A. #2\hspace{\stretch{2}} B. #3\hspace{\stretch{3}}\par
C. #4\hspace{\stretch{2}} D. #5\hspace{\stretch{3}}\or % 2
A. #2\par B. #3\par C. #4\par D. #5\else % 3
\relax % 4
\fi
}%
\addvspace{.2em}\stepcounter{numexm}
\setlength\parindent{0em} Example \thenumexm.
}{\par\makechoice\par\addvspace{.2em}}
\begin{document}
\section{One}
\begin{ntexmC}[1]{AAAAAAA}{BBBBBBB}{CCCCCCC}{DDDDDDD}% replace 1 with first
The title (\hspace{1em})
\end{ntexmC}
\end{document}
\addvspace{<len>}
需要处于垂直模式,因此在它前面加上\par
。以下是 的定义,\addvspace
表示如果不处于垂直模式,则会抛出“无项目错误v
” mode
:
\def\addvspace#1{%
\ifvmode
\if@minipage\else
\ifdim \lastskip =\z@
\@vspace@calcify{#1}%
\else
\setlength\@tempskipb{#1}%
\@xaddvskip
\fi
\fi
\else
\@noitemerr
\fi}
答案2
这仅有的涉及的法律解释\value
形式为
\value{<counter name>}
并返回存储在计数器中的整数的“抽象”值。
您可以在(或任何定义的计数器)的上下文中使用\value{section}
或。因此,您可以这样做\value{page}
\ifcase
\newcounter{forifcase}
\newenvironment{ntexmC}[5][0]{%
\setcounter{forifcase}{#1}%
\newcommand\makechoice{%
\ifcase\value{forifcase}%
但做起来要简单得多
\newenvironment{ntexmC}[5][0]{%
\newcommand\makechoice{%
\ifcase#1\relax\or
这\relax
将阻止 TeX 寻找更多数字。