如何交替枚举列表中的标签样式?

如何交替枚举列表中的标签样式?

如何根据我使用的命令交替显示枚举列表的计数器?例如,我想要\foo{poor Yorick!}看起来像,(9) poor Yorick!但我想要\bar{Joelle}一个像这样的标签[8] Joelle

我想要的变体的半合理上下文截图

细节和动机

(这样我们就可以避免XY问题

我之前问过一个关于用于编写结构化推导的 LaTeX 包的问题:哪些软件包/实践与编写结构化推导相关?(类似于 Dijkstra 的计算证明风格)。我现在正在研究一些小解决方案,受到所获帮助的启发。

SD 背后的一位研究人员简单地将他们的证明格式描述为两列列表:左侧的小列表用于关系符号,右侧的大列表用于解释。因此,我试图将 SD 实现为枚举列表,以enumitem帮助进行任何格式化。似乎如果我可以将定义保持在像扩展列表环境这样简单的状态,那么嵌套 SD 应该是自然而然的。

以下是我目前拥有的一些内容:

\ProvidesPackage{structured_derivations}
\RequirePackage{xparse, enumitem}

\NewDocumentCommand{\task}{m}{
    \item[\textbullet] #1 % not numbered. i.e., also not mutating the counter
}

\NewDocumentCommand{\assumption}{s m}{
    \IfBooleanTF{#1} % determines if command was used with a star
        {\item[$-$]} % \assumption*{…
        {\item} % \assumption{…
                % label=(\arabic*)
    #2 % content of assumption
}

\NewDocumentCommand{\observation}{s m m}{

    \IfBooleanTF{#1}
        {\item[$+$]}
        {\item} % label=\lbrack\arabic*\rbrack
    \{ #2 \} % justification

    \item[] #3 % actual observation
}
% TODO maybe abstract out the common structure between \observation and \assumption?

% anyway, there are more command definitions and then I probably need something like
\newlist{structured_derivation}{enumerate}{5} % picking this number pretty arbitrarily
\setlist[structured_derivation]{label={}} % because I'll be overriding it anyway?

理想情况下,这个问题的解决方案将与我的目标兼容,即在嵌套推导时也可以选择重置计数器(以表明假设是不是遗传)。

这一切都是为了能够写出这样的证明:

% (btw, also using the exercise package)
\begin{Exercise} [number=4]
  Assume that $n,m \in \naturals$. \\
  Show: ($m$ is odd $\land$ $n$ is odd) $\implies$ $m + n$ is even.
\end{Exercise}
\begin{Answer}  
  \begin{structured_derivation}
    \task{Prove that $m + n$ is necessarily even if $m$ and $n$ are both odd.}
    \assumption*{$n \in \naturals$}
    \assumption*{$m \in \naturals$}
    \isProvedBy{assume $m$ and $n$ are odd, and then derive that $m + m$ is even to demonstrate implication}
    \begin{structured_derivation}
      \task{Prove that $m + n$ is even when:}
      \assumption{$m$ is odd}
      \assumption{$n$ is odd}
      \observation
        {definition of odd-ness}
        {$\exists{x} \in \integers \suchthat m = 2x + 1$}
      \observation
        {definition of odd-ness}
        {$\exists{y} \in \integers \suchthat n = 2y + 1$}
      % continues...
    \end{structured_derivation}
  \end{structured_derivation}
\end{Answer}

如果您还知道如何使括号不再必要,我会找到一个精灵来实现您的愿望,就像这样\item

\task blah
\assumption* blah
\assumption* blah
\observation blah
\begin{structured_derivation}
    \task blah

答案1

更新的解决方案:

我认为,与其使用不同的宏(如下面的早期版本所示),不如使用一个足够灵活的宏来执行您想要的操作更有意义。这里我定义了一个宏\MyItem[<left>][<right>]{<content>},它接受两个可选参数:

  • 如果未指定任何可选参数,则枚举项目打印为2.
  • 如果指定了两个可选参数,则它们将被视为放置在枚举项。因此枚举项将被排版为<left>2<right>
  • 如果只提供了一个可选参数,那么它将被用作逐项列出标签且枚举暂停。

以下是一些可能性:

在此处输入图片描述

进一步增强:

  • 如果您的文档中有多个这样的内容,那么您将需要一种方法来重置枚举使用的计数器,或者使用不同的系列名称。

代码:

\documentclass{article}
\usepackage{enumitem}
\usepackage{xparse}

\NewDocumentCommand{\MyItem}{o o m}{%
    % If #2, second optional second parameter, is provided then
    %    use an enumerated item with #1 = left, #2 = right
    % else if the
    %    use #1, first optional parameter is provided 
    %       use #1 as the itemize label
    % else use enumerated number
    %
    % #3 = content
    %
    \IfNoValueTF{#2}{%
        \IfNoValueTF{#1}{%
            \begin{enumerate}[series=MyItem,resume=*,label={\arabic*.}]%
                \item #3%
            \end{enumerate}%
        }{%
            \begin{itemize}[label={#1}]%
                \item #3%
            \end{itemize}%
        }%
    }{%
        \begin{enumerate}[series=MyItem,resume=*,label={#1\arabic*#2}]%
            \item #3%
        \end{enumerate}%
    }%
}%


\begin{document}
    \MyItem{no parameter}
    \MyItem[(][)]{use round braces}
    \MyItem[{[}][{]}]{use square braces}
    \MyItem[$\langle$][$\rangle$]{use angle braces}
    \MyItem{no parameter - numbering continues}
    \MyItem[{[}][$\rangle$]{use mixed braces}
    \MyItem[$-$]{custom symbol}
    \MyItem[][)]{no left bracket}
    \MyItem[][]{no symbol for left and right}
    \MyItem[$\ast$][]{no symbol for right}
    \MyItem[$\circ$]{another custom symbol!}
    \MyItem{no parameter - numbering continues}
\end{document}

如果我理解正确的话,这应该可以满足您的要求。它resume使用包裹enumitem

因此,\Foo{poor Yorick!}使用()当前enumerate数字来提供标签。但它还接受一个可选的第一个参数,您可以在其中提供自己的标签(在这种情况下,环境itemize与提供的标签一起使用,以免增加计数器enumerate。类似地,\Bar{}但默认情况下使用[]枚举标签。

当为两个宏中的任何一个提供可选参数时,\Foo\Bar行为相同。

在此处输入图片描述

进一步增强:

  • \Foo对、 和采取更有意义的名称\Bar

代码:

\documentclass{article}
\usepackage{enumitem}
\usepackage{xparse}


\NewDocumentCommand{\Foo}{o m}{%
    \IfNoValueTF{#1}{%
        \begin{enumerate}[series=Questions,resume=*,label={(\arabic*)}]%
            \item #2%
        \end{enumerate}%
    }{%
        \begin{itemize}[label={#1}]%
            \item #2%
        \end{itemize}%
    }%
}%

\NewDocumentCommand{\Bar}{o m}{%
    \IfNoValueTF{#1}{%
        \begin{enumerate}[series=Questions,resume=*,label={[\arabic*]}]%
            \item #2%
        \end{enumerate}%
    }{%
        \begin{itemize}[label={#1}]%
            \item #2%
        \end{itemize}%
    }%
}%


\begin{document}
    \Foo{poor Yorick!}
    \Foo[$+$]{poor Yorick!}
    \Bar{Joelle}
    \Bar[$-$]{Joelle}
    \Foo[$\circ$]{poor Yorick!}
    \Foo{poor Yorick!}
\end{document}


\end{document}

相关内容