![定义一个编号的、可引用的环境](https://linux22.com/image/431628/%E5%AE%9A%E4%B9%89%E4%B8%80%E4%B8%AA%E7%BC%96%E5%8F%B7%E7%9A%84%E3%80%81%E5%8F%AF%E5%BC%95%E7%94%A8%E7%9A%84%E7%8E%AF%E5%A2%83.png)
在我正在编写的文档中,我经常需要使用 tikz-cd 绘制交换图(参见 MWE)。我想定义一个diagram
具有以下属性的自定义环境:
- 没有样板代码:环境中只有 tikz-cd 命令
- 居中
- 有自己的柜台
- 可通过引用名称引用
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}
,设置\@ignoretrue
which 会通知 LaTeX\ignorespaces
在完成环境时执行的操作。但是,由于使用\begin
和来开始和结束等式,该设置会丢失,因为它们将所有内容包装在一个组中,并且我们丢失了调用时\end
的值。\@ignoretrue
\end{diagram}
可能无聊:如果我们在环境周围使用\begin{center}
... ,我们就不会获得额外的空间。深入研究正在发生的事情(环境是环境的变体),神奇之处在于因为(和和... )是... ¹周围相对较薄的包装。\end{center}
tikzcd
center
trivlist
equation
displaymath
\[
\]
$$
$$
结束一边
由于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
,但如果您是为了更广泛使用而创建它,您可能希望将其分解为单独的命令,以便用户更轻松地自定义外观。
- 向 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}