这是来自的后续报道:自定义枚举
我想要获得类似的东西:
Axioms list :
A1. First axiom
A2. Second axiom
A2'. Equivalent version of the second axiom
具有交叉引用,并且以良好的内容导向方式。更具体地说,我希望它能够提供方便的重新排序功能,并且如果它可以生成所有此类枚举,那就太好了。例如,我不希望需要一个新的命令:
Hypothesis list :
H1) First hypothesis
H2) Second
H2') Another version of the second
在此设置中,重新定义枚举环境中的变量(本地或全局)是可以的。
我目前最好的是:(感谢 egreg 的回答)
\documentclass{article}
\usepackage{enumitem}
\makeatletter
\def\myEnumCounter#1{\expandafter\@myEnumCounter\csname c@#1\endcsname}
\def\@myEnumCounter#1{\ifcase#1\or \or $'$\or $''$\fi}
\makeatother
\AddEnumerateCounter*{\myEnumCounter}{\@myEnumCounter}{3}
\newlist{axioms}{enumerate}{2}
\setlist[axioms,1]{label=\textbf{A\arabic{axiomsi}.}, ref=A\arabic{axiomsi}}
\setlist[axioms,2]{label=\textbf{A\arabic{axiomsi}\rlap{\myEnumCounter{axiomsii}}.},%
ref=A\arabic{axiomsi}\myEnumCounter{axiomsii},%
align=parleft,%
leftmargin=0em,%
itemsep=1.4ex,%
before={\stepcounter{axiomsi}}}
\begin{document}
\noindent Fail attempt %(useful to compare indentation and vertical separation):
\begin{enumerate}[label=\textbf{A\arabic*.}]
\item \label{item:A1} Axiom 1
\item \label{item:A2} Axiom 2
\item[\textbf{A2'}] \label{item:A2prime} Axiom 3
\end{enumerate}
\noindent "Almost there" attempt :
\begin{axioms}
\item \label{item:B1} Axiom 1
\item[]
\begin{axioms}
\item \label{item:B2} Axiom 2
\item \label{item:B2prime} Axiom 2'
\end{axioms}
\end{axioms}
\noindent References : \ref{item:A1}, \ref{item:A2} and \ref{item:A2prime} (last one doesn't work).
\noindent References : \ref{item:B1}, \ref{item:B2} and \ref{item:B2prime}.
\end{document}
结果是:(不完全是最新的)
然而,仍然存在一些问题:
- 我用答案来嵌套枚举,跳过项目以避免在需要输入第二个枚举时出现额外的标签。但是,结果有点不符合“面向内容”的条件。此外,这里的情况有点不同,因为有一个方案:当且仅当该项目不是新环境时,我才想要一个标签
axioms
。我想有一种方法可以用enumitem
样式键来实现这一点,但我不知道该怎么做。 - 我无法抑制子枚举的 1mm 偏移(我想我尝试了所有
enumitem
提供水平间距的键) - 我必须添加
itemsep=1.4ex
以确保子枚举具有与主枚举相同的垂直间距,但我认为有更好的方法来做到这一点。
答案1
我会简化整个事情:
\documentclass{article}
\usepackage{enumitem}
\newenvironment{axioms}
{\enumerate[label=\textbf{A\arabic*.}, ref=A\arabic*]}
{\endenumerate}
\makeatletter
\newcommand\varitem[1]{\item[\textbf{A\arabic{enumi}\rlap{$#1$}.}]%
\edef\@currentlabel{A\arabic{enumi}{$#1$}}}
\makeatother
\begin{document}
\begin{axioms}
\item \label{item:A1} Axiom 1
\item \label{item:A2} Axiom 2
\varitem{'} \label{item:A2prime} Axiom 2$'$
\varitem{''} \label{item:A2dprime} Axiom 2$''$
\item Axiom 3
\varitem{'} Axiom 3$'$
\end{axioms}
\noindent References : \ref{item:A1}, \ref{item:A2} and \ref{item:A2prime}.
\end{document}
在我看来,\rlap
更好(并且素数肯定比撇号好),但你可以简单地摆脱它。
如果您想要不同的字母,最好将其重新定义\varitem
为环境的一部分:
\providecommand{\varitem}{} % to keep LaTeX quiet
\makeatletter
\newenvironment{axioms}[1]
{\renewcommand\varitem[1]{\item[\textbf{#1\arabic{enumi}\rlap{$##1$}.}]%
\edef\@currentlabel{#1\arabic{enumi}{$##1$}}}%
\enumerate[label=\textbf{#1\arabic*.}, ref=#1\arabic*]}
{\endenumerate}
\makeatother
你必须将这封信传递给环境:
\begin{axioms}{A}
\item \label{item:A1} Axiom 1
\item \label{item:A2} Axiom 2
\varitem{'} \label{item:A2prime} Axiom 2$'$
\varitem{''} \label{item:A2dprime} Axiom 2$''$
\item Axiom 3
\varitem{'} Axiom 3$'$
\end{axioms}
或者,您可以定义一个“通用”环境和基于它的其他环境
\providecommand{\varitem}{} % to keep LaTeX quiet
\makeatletter
\newenvironment{statements}[1]
{\renewcommand\varitem[1]{\item[\textbf{#1\arabic{enumi}\rlap{$##1$}.}]%
\edef\@currentlabel{#1\arabic{enumi}{$##1$}}}%
\enumerate[label=\textbf{#1\arabic*.}, ref=#1\arabic*]}
{\endenumerate}
\makeatother
\newenvironment{axioms}{\statements{A}}{\endstatements}
\newenvironment{hypotheses}{\statements{H}}{\endstatements}
因此axioms
可以像以前一样使用。