检查枚举计数器以获取自定义标签

检查枚举计数器以获取自定义标签

我想专门为算法创建一个自定义枚举环境:
第一个 \item 应该有标签Input:
第二个 \item 应该有标签Output:
从那时起,就有了标准 (\arabic*) 计数器。
它应该是这样的:

在此处输入图片描述

我让计数器偏移量工作了,但我不知道如何检查前两个项目的计数器。我该怎么做?我已经尝试了、、和等
的各种组合,所有 if 都导致以下结果:algoalgoithealgo\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}

在此处输入图片描述

相关内容