自定义枚举

自定义枚举

我在以自定义样式列举公理列表时遇到问题。

例如,如果我想写下一个函数必须满足的公理,才能使其成为环的同态,我更愿意称其为 (HOM1) 和 (HOM2)。我了解到,这可以通过以下方法实现:

A map $f$ between two rings $R$ and $S$ is called a ring homomomorphism if
they respect the algebraic structure in both of them. More precisely, 
\begin{itemize}
\item[HOM1] $f(r_1+r_2)=f(r_1)+f(r_2)$
\item[HOM2] $f(r_1 \cdot r_2)=f(r_1) \cdot f(r_2)$
\end{itemize}

但问题是,我完全没有办法在证明中准确引用这些公理中的一个,而不必“粗暴地”输入(HOM1)来引用该公理。

这看起来有点像当有多个方程式时不知道如何引用它们,比如在对齐构造中。

任何为实现这一目标所提供的帮助都将受到感谢。

答案1

1. 自动生成的标签:

对于列表名称中存在简单模式的情况,可以使用正常enumerate包裹enumitem如下:

\begin{enumerate}[label=HOM\arabic{*}, ref=(HOM\arabic{*}),leftmargin=5.0em]
    \item $f(r_1+r_2)=f(r_1)+f(r_2)$ \label{item: FirstHom}
    \item $f(r_1 \cdot r_2)=f(r_1) \cdot f(r_2)$
\end{enumerate}

然后通常\ref{item: FirstHom}会产生所需的结果:

在此处输入图片描述


2. 手动指定标签(黑客警报)

更一般的情况是以任意方式手动指定标签,需要对格式进行微小更改,因为列表内容需要采用以下形式{}

\begin{MyDescription}[leftmargin=5.0em]
    \item[GRP1]{$f(r_1+r_2)=f(r_1)+f(r_2)$ \label{item: FirstGrp}}
    \item[RNG1]{$f(r_1 \cdot r_2)=f(r_1) \cdot f(r_2)$ \label{item: FirstRng}}
\end{MyDescription}

通过这种语法和一些技巧,使用\ref{item: FirstGrp}\ref{item: FirstRng}可得到以下结果:

在此处输入图片描述


笔记:

  • 需要运行两次才能解析引用。在第一次运行中,您将看到??,然后在第二个中,它将被实际的列表编号替换。
  • 需要注意的是,在这个答案是关于 mdframed 和 item 之间的奇怪互动,egreg 提到

    重新定义\item可能很危险,而且会产生不可预测的结果

    这正是我为手动指定的标签版本,因此如果在某些情况下失败,可能需要替代解决方案。

代码:

\documentclass{article}
\usepackage{enumitem}

\let\OldItem\item% remember the previous definition
\newcommand{\MyItem}[2][]{}%
\newenvironment{MyDescription}[1][]{%
    \renewcommand{\item}[2][]{%
        \begin{enumerate}[#1,label={##1},ref={(##1)}]%
            \OldItem {##2}%
        \end{enumerate}%
    }%
}{%
}%

\begin{document}
\section{Auto Generated Labels}

\noindent
A map $f$ between two rings $R$ and $S$ is called a ring homomorphism if
they respect the algebraic structure in both of them. More precisely,

\begin{enumerate}[label=HOM\arabic{*}, ref=(HOM\arabic{*}),leftmargin=5.0em]
    \item $f(r_1+r_2)=f(r_1)+f(r_2)$ \label{item: FirstHom}
    \item $f(r_1 \cdot r_2)=f(r_1) \cdot f(r_2)$
\end{enumerate}
As can be seen in \ref{item: FirstHom} we conclude \ldots

\section{Manually Specified Labels}
A map $f$ between two rings $R$ and $S$ is called a ring homomorphism if
they respect the algebraic structure in both of them. More precisely,

\begin{MyDescription}[leftmargin=5.0em]
    \item[GRP1]{$f(r_1+r_2)=f(r_1)+f(r_2)$ \label{item: FirstGrp}}
    \item[RNG1]{$f(r_1 \cdot r_2)=f(r_1) \cdot f(r_2)$ \label{item: FirstRng}}
\end{MyDescription}
As can be seen in \ref{item: FirstGrp}, and \ref{item: FirstRng}  we also conclude \ldots
\end{document}

答案2

这是对原始问题的评论中提到的最后一个编号方案的可能解决方案(它太长了,不能作为评论);我们的想法是使用包提供的series方法:resume*enumitem

\documentclass{article}
\usepackage{enumitem}

\begin{document}

\begin{enumerate}[leftmargin=1.3cm,label=Grp\arabic*,ref=(Grp\arabic*),series=group]
  \item $a + (b + c) = (a + b) + c$. \label{ite:gras}
\end{enumerate}
\begin{enumerate}[leftmargin=1.3cm,label=Rng\arabic*,ref=(Rng\arabic*),series=ring]
  \item $a + (b + c) = (a + b) + c$. \label{ite:rnas}
\end{enumerate}
\begin{enumerate}[leftmargin=1.3cm,label=Fld\arabic*,ref=(Fld\arabic*),series=field]
  \item $a + (b + c) = (a + b) + c$. \label{ite:flas}
\end{enumerate}
And now some text...
\begin{enumerate}[resume*=group]
  \item $a + e = e + a = a$. \label{ite:grne}
\end{enumerate}
\begin{enumerate}[resume*=ring]
  \item $a + e = e + a = a$. \label{ite:rnne}
\end{enumerate}
\begin{enumerate}[resume*=field]
  \item $a + e = e + a = a$. \label{ite:flne}
\end{enumerate}
And once again some text...
\begin{enumerate}[resume*=group]
  \item $a + b = b + a = e$. \label{ite:grin}
\end{enumerate}
\begin{enumerate}[resume*=ring]
  \item $a + b = b + a = e$. \label{ite:rnin}
\end{enumerate}
\begin{enumerate}[resume*=field]
  \item $a + b = b + a = e$. \label{ite:flin}
\end{enumerate}
And some references: \ref{ite:rnas}, \ref{ite:flne}, and \ref{ite:grin}...

\end{document}

在此处输入图片描述

答案3

我是一名工程师,不是数学家,但我认为下面的语法更简洁,可以用enumitem处理群、域和同态内容的一致缩进:

在此处输入图片描述

\documentclass{article}
\usepackage[thref]{ntheorem}
\let\hom\relax % since hom defined in amsmath (http://tex.stackexchange.com/a/34927/3345)
\makeatletter
\newtheoremstyle{homstyle}% (http://tex.stackexchange.com/a/36563/3345)
  {\item[\hskip\labelsep \theorem@headerfont ##1 ##2\theorem@separator{}]}%
  {\item[\hskip\labelsep \theorem@headerfont ##1 ##2\theorem@separator{} (##3)]}
\newtheoremstyle{grpstyle}%
  {\item[\hskip\labelsep \theorem@headerfont ##1 ##2\theorem@separator{}]}%
  {\item[\hskip\labelsep \theorem@headerfont ##1 ##2\theorem@separator{} (##3)]}
\newtheoremstyle{fldstyle}%
  {\item[\hskip\labelsep \theorem@headerfont ##1 ##2\theorem@separator{}]}%
  {\item[\hskip\labelsep \theorem@headerfont ##1 ##2\theorem@separator{} (##3)]}
\makeatother
\theoremstyle{homstyle} \newtheorem{hom}{HOM}
\theoremstyle{grpstyle} \newtheorem{grp}{GRP}
\theoremstyle{fldstyle} \newtheorem{fld}{FLD}

\begin{document}
A map $f$ between two rings $R$ and $S$ is called a ring homomomorphism if
they respect the algebraic structure in both of them. More precisely, 
\begin{hom}
$f(r_1+r_2)=f(r_1)+f(r_2)$ \label{hom:first}
\end{hom}
\begin{hom}
$f(r_1 \cdot r_2)=f(r_1) \cdot f(r_2)$ \label{hom:second}
\end{hom}
As seen in \thref{hom:first} and \thref{hom:second}, \ldots{}
Futhermore, we can define groups and fields, subjects unfamiliar to most engineers as
\begin{grp}
$1+e^{i \pi}=0$
\end{grp}
\begin{grp}
$\sin^2\theta + \cos^2 \theta = 1$
\end{grp}
\begin{fld}
$3 \approx \pi$
\end{fld}
\end{document}

有一件事我还没搞清楚,那就是如何消除\thref命令中标签和数字之间的空格。不过,在标签中删除它是没有问题的。

答案4

手册enumitem建议我采用以下解决方案。它仍然有点儿像黑客,并且需要用户提供枚举的所有标签,所以我想它仍然需要一些调整。

\documentclass{article}

\usepackage{enumitem}

\makeatletter
\def\myEnumCounter#1{\expandafter\@myEnumCounter\csname c@#1\endcsname}
\def\@myEnumCounter#1{\ifcase#1\or Grp1\or Rng1\or Fld1\fi}
\makeatother

% In the next line, Grp1 has to be replaced by the widest label in the enumeration.
% An alternative syntax is :
% \AddEnumerateCounter*{\myEnumCounter}{\@myEnumCounter}{1}
% which means the widest label is the 1st one.

\AddEnumerateCounter{\myEnumCounter}{\@myEnumCounter}{Grp1}


\begin{document}
\begin{enumerate}[label=\textbf{\myEnumCounter*.},ref=\myEnumCounter*]
  \item \label{item:1} Group equation
  \item \label{item:2} Ring equation
  \item \label{item:3} Field equation
\end{enumerate}

\noindent References : \ref{item:1}, \ref{item:2} and \ref{item:3}.
\end{document}

如果计数器比较自然,即使没有方案,它也能解决问题。但是,在这里和许多其他示例中,情况可能并非如此,并且上面提出的解决方案对于一次性使用的环境应该更为方便。

相关内容