我想专门为算法创建一个自定义枚举环境:
第一个 \item 应该有标签Input:
第二个 \item 应该有标签Output:
从那时起,就有了标准 (\arabic*) 计数器。
它应该是这样的:
我让计数器偏移量工作了,但我不知道如何检查前两个项目的计数器。我该怎么做?我已经尝试了、、和等
的各种组合,所有 if 都导致以下结果:algo
algoi
thealgo
\thealgo
\value{...}
梅威瑟:
\documentclass[a4paper,12pt]{article}
\usepackage{amsmath}
\usepackage{ifthen}
\usepackage[shortlabels]{enumitem}
\newcommand{\step}{
\ifthenelse{ \equal{\value{algoi}}{-2} }
{ \item[Input: ]}
{ \ifthenelse { \equal{\value{algoi}}{-1} }
{\item[Output: ]}
{\item }
}
}
\newenvironment{algo}{\begin{enumerate}[label=(\arabic*), start = -1]}{\end{enumerate}}
\begin{document}
\begin{algo}
\step This is the input.
\step This is the output.
\step This is step 1.
\step This is step 2.
\end{algo}
\end{document}
You can't use `\relax' after \the. \step
此代码将为每个抛出两次错误消息\step
。
答案1
我会避免\ifthenelse
。这里有一种方法也可以自动与左边距对齐。
\documentclass[a4paper,12pt]{article}
\usepackage{showframe}
\usepackage{amsmath}
\usepackage{enumitem}
\ExplSyntaxOn
\NewExpandableDocumentCommand{\steplabel}{m}
{
\xoriun_steplabel_std:n { #1 }
}
\NewExpandableDocumentCommand{\steplabelref}{m}
{
\xoriun_steplabel_ref:n { #1 }
}
\cs_new:Nn \xoriun_steplabel_std:n
{
\__xoriun_steplabel:nnn { ( } { ) } { #1 }
}
\cs_new:Nn \xoriun_steplabel_ref:n
{
\__xoriun_steplabel:nnn { } { } { #1 }
}
\cs_new:Nn \__xoriun_steplabel:nnn
{
\int_case:nnF { \value{#3} }
{
{-1}{Input:}
{0}{Output:}
}
{#1\arabic{#3}#2}
}
\AddEnumerateCounter{\steplabel}{\xoriun_steplabel_std:n}{Output:}
\AddEnumerateCounter{\steplabelref}{\xoriun_steplabel_ref:n}{Output:}
\ExplSyntaxOff
\let\step\item
\newenvironment{algo}
{\begin{enumerate}[label=\steplabel*,ref=\steplabelref*,start=-1,leftmargin=*]}
{\end{enumerate}}
\begin{document}
\begin{algo}
\step This is the input.
\step This is the output.
\step This is step 1.\label{test}
\step This is step 2.
\end{algo}
\ref{test}
\end{document}
我定义了两个新的计数器表示,即\steplabel
和\steplabelref
,后者是为了避免步骤编号周围有括号。接下来,将这两个表示注册到enumitem
。
如果希望在交叉引用中步骤编号周围加上括号,只需删除该ref=
键即可。
答案2
没有计数器algoi
,在枚举中它被称为enumi
:
\documentclass[a4paper,12pt]{article}
\usepackage{amsmath}
\usepackage{ifthen}
\usepackage[shortlabels]{enumitem}
\newcommand{\step}{
\ifthenelse{ \equal{\value{enumi}}{-2} }
{ \item[Input: ]\stepcounter{enumi}}
{ \ifthenelse { \equal{\value{enumi}}{-1} }
{\item[Output: ]\stepcounter{enumi}}
{\item }
}
}
\newenvironment{algo}{\begin{enumerate}[label=(\arabic*), start = -1]}{\end{enumerate}}
\begin{document}
\begin{algo}
\step This is the input.
\step This is the output.
\step This is step 1.
\step This is step 2.
\end{algo}
\end{document}