公理或假设的自定义枚举

公理或假设的自定义枚举

这是来自的后续报道:自定义枚举

我想要获得类似的东西:

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可以像以前一样使用。

相关内容