定义一个编号的、可引用的环境

定义一个编号的、可引用的环境

在我正在编写的文档中,我经常需要使用 tikz-cd 绘制交换图(参见 MWE)。我想定义一个diagram具有以下属性的自定义环境:

  1. 没有样板代码:环境中只有 tikz-cd 命令
  2. 居中
  3. 有自己的柜台
  4. 可通过引用名称引用Diagram ??

我最好的尝试是将equation和包装tikzcd到一个环境中,但这并不能解决交叉引用的问题,而且缩进很奇怪:

\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz-cd}
\usepackage[noabbrev,capitalize]{cleveref}

% custom environment
\newenvironment{diagram}{%
    \begin{equation}\begin{tikzcd}%
    }{%
    \end{tikzcd}\end{equation}%
    }

\begin{document}
A numbered equation-diagram:
\begin{equation}
    \label{dia:equation}
    \begin{tikzcd}
        A \ar[r] & B
    \end{tikzcd}
\end{equation}
However, the reference is an equation: \cref{dia:equation}

\begin{diagram}
    \label{dia:diagram-env}
    A \ar[r] & B
\end{diagram}
Note the weird indentation of \cref{dia:diagram-env} at the start of this line and that (obviously) the reference still mentions an equation and the counter is (obviously) still bounded to other equations. 
\end{document}

答案1

您可以保存 的值equation并将其替换为 的当前值diagram。使用\crefalias是关键。

diagram用一个可选参数来定义选项tikz-cd:它们经常是需要的。

\documentclass{article}
\usepackage{amsmath}
\usepackage{tikz-cd}
\usepackage[noabbrev,capitalize]{cleveref}

% custom environment
\newcounter{diagram}
\crefname{diagram}{Diagram}{Diagrams}
\newcounter{savedequation}
\newenvironment{diagram}[1][]
 {%
  \setcounter{savedequation}{\value{equation}}%
  \setcounter{equation}{\value{diagram}}%
  \crefalias{equation}{diagram}%
  \begin{equation}\begin{tikzcd}[#1]%
 }
 {%
  \end{tikzcd}\end{equation}%
  \setcounter{diagram}{\value{equation}}%
  \setcounter{equation}{\value{savedequation}}%
  \ignorespacesafterend % <-- no space after the diagram environment
 }

\begin{document}
A numbered diagram:
\begin{diagram}
    \label{dia:equation}
        A \ar[r] & B
\end{diagram}
and the reference is a to a diagram: \cref{dia:equation}
\begin{diagram}
    \label{dia:diagram-env}
    A \ar[r] & B
\end{diagram}
There is no weird indentation of \cref{dia:diagram-env} at the start 
of this line and the reference mentions ``Diagram''.
Now we have a regular equation
\begin{equation}\label{try}
1+1=2
\end{equation}
How will the reader distinguish between \cref{try} and \cref{dia:equation}?

\end{document}

然而,正如您所看到的,如果您打算对方程式进行编号,那么您会遇到重复数字的问题。

在此处输入图片描述

为了hyperref

\newenvironment{diagram}[1][]
 {%
  \setcounter{savedequation}{\value{equation}}%
  \setcounter{equation}{\value{diagram}}%
  \renewcommand{\theHequation}{diagram\theequation}% <--- keep hyperref happy
  \crefalias{equation}{diagram}%
  \begin{equation}\begin{tikzcd}[#1]%
 }
 {%
  \end{tikzcd}\end{equation}%
  \setcounter{diagram}{\value{equation}}%
  \setcounter{equation}{\value{savedequation}}%
  \ignorespacesafterend % <-- no space after the diagram environment
 }

答案2

这里有几件事要做。首先,你需要一个计数器,因此你需要用以下方式定义它\newcounter

\newcounter{diagram}

我们弄清楚格式之后再回来讨论这个问题。

第一行上的多余空格是由于环境equation管理忽略了 — 后面的空格而导致的\end{equation},设置\@ignoretruewhich 会通知 LaTeX\ignorespaces在完成环境时执行的操作。但是,由于使用\begin和来开始和结束等式,该设置会丢失,因为它们将所有内容包装在一个组中,并且我们丢失了调用时\end的值。\@ignoretrue\end{diagram}

可能无聊:如果我们在环境周围使用\begin{center}... ,我们就不会获得额外的空间。深入研究正在发生的事情(环境是环境的变体),神奇之处在于因为(和和... )是... ¹周围相对较薄的包装。\end{center}tikzcdcentertrivlistequationdisplaymath\[\]$$$$结束一边

由于equation除了编号之外,它还提供了您想要的大部分内容,我们可以使用它的变体来产生您的居中:我们需要有\makeatletter...\makeatother围绕它才能设置\@ignoretrue

\newenvironment{diagram}{%
    $$\refstepcounter{diagram}
      \begin{tikzcd}
    }{%
    \end{tikzcd}
    \eqno\hbox{\normalfont\normalcolor (\thediagram)}$$\@ignoretrue
    }

\refstepcounter推进diagram我们之前定义的计数器,并使环境\label内的任何内容diagram引用计数器的新设置值。\eqno是一个 TeX 基元,让我们将方程编号放在一边。我已将图表编号的所有格式直接放入环境声明中diagram,但如果您是为了更广泛使用而创建它,您可能希望将其分解为单独的命令,以便用户更轻松地自定义外观。


  1. 向 LaTeX 3 核心团队提问:不应该\begin{equation}像未编号的显示数学那样包含以下内容吗?
\ifvmode
    \nointerlineskip
    \makebox[.6\linewidth]{}%
\fi

答案3

我不确定您想要的排版结果是什么,但以下内容可能会对您有所帮助。

% envprob.tex  SE 591990
\documentclass{article}
\usepackage{tikz-cd}
\usepackage{cleveref}

%\makeatletter
%\newcommand{\p@diagctr}{\thediagctr}
\newcounter{diagctr}
\newenvironment{diagram}{%
  \centering
  \refstepcounter{diagctr}%
  Diagram \arabic{diagctr}
  \[
  \begin{tikzcd}}
  {\end{tikzcd}\]\par}

\begin{document}

\section{First}

A numbered equation-diagram:
\begin{equation}
    \label{dia:equation}
    \begin{tikzcd}
        A \ar[r] & B
    \end{tikzcd}
\end{equation}
However, the reference is an equation: \cref{dia:equation}

\begin{diagram}
    A \ar[r] & B
    \label{dia:diagram-env}
\end{diagram}

\begin{diagram}
    A \ar[r] & B
    \label{dia:diagram-second}
\end{diagram}

Note that this reference \verb!\ref{dia:diagram-second}!  
Diagram \ref{dia:diagram-second} is to the diagram number.

\end{document}

在此处输入图片描述

相关内容