如何根据我使用的命令交替显示枚举列表的计数器?例如,我想要\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}