![使用 \cref{**} 绘制图表和方程式](https://linux22.com/image/433821/%E4%BD%BF%E7%94%A8%20%5Ccref%7B**%7D%20%E7%BB%98%E5%88%B6%E5%9B%BE%E8%A1%A8%E5%92%8C%E6%96%B9%E7%A8%8B%E5%BC%8F.png)
感谢回答,这建议我使用 \cref{} 来引用章节、定义等。
我对方程式和图表都使用了 \begin{equation} \end{equation}。因此,当我使用 \cref{} 时,我得到的是图表的方程式(参考编号)。有办法解决这个问题吗?
请参阅 Willie Wong 的建议后的最小工作示例
\documentclass[11pt,twoside]{book}
%%% Packages
% 1. fonts
\usepackage[T1]{fontenc} % recommended
%\usepackage[utf8]{inputenc} % no longer needed
\usepackage{fix-cm} % for Computer Modern (comment if using the next line)
%\usepackage{newpxtext,newpxmath} % for Palatino
%\usepackage{upgreek} % do you need it?
%\usepackage{charter} % it has no support for math
%\usepackage{relsize} % do you need it?
\usepackage{a4wide}
% 2. Math
\usepackage{stmaryrd}
\usepackage{mathrsfs}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{mathtools}
\usepackage{bm}% bold math
\usepackage[normalem]{ulem}
% 3. Graphics and special effects
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{cd}
\usepackage{tikz-cd}
\usepackage{shadow}% do you need it?
\usepackage{fancybox}% do you need it?
\usepackage{scalerel,stackengine}
\usepackage{eso-pic}
% 4. Document formatting
\usepackage{setspace}
\usepackage{fancyhdr}
\usepackage{appendix}
\usepackage[nottoc]{tocbibind}
\usepackage{alltt}
\usepackage{amsthm}
\usepackage[colorlinks]{hyperref}
\usepackage[nameinlink]{cleveref}
\newcounter{diagram}
\newenvironment{diagram}{\setcounter{diagram}{\value{equation}}\refstepcounter{diagram}}{}
\begin{document}
\pagenumbering{roman}
\include{Title}
\newpage
\thispagestyle{empty}
\bigskip{}
\vspace{1cm} \cleardoublepage
\begin{diagram}\label{diagram:diagram}
\begin{equation}
\begin{tikzcd}[sep=large]
A \arrow[dd] \arrow[rrr] & & & B \arrow[dd] \\
& & & \\
C \arrow[rrr] & & & D
\end{tikzcd}
\end{equation}
\end{diagram}
\begin{diagram}
\begin{equation}\label{diagram:diagram1}
\begin{tikzcd}[sep=large]
A \arrow[dd] \arrow[rrr] & & & B \arrow[dd] \\
& & & \\
C \arrow[rrr] & & & D
\end{tikzcd}
\end{equation}
\end{diagram}
\begin{equation}\label{eqn:equation}
y = mx + c
\end{equation}
\Cref{diagram:diagram}
\Cref{diagram:diagram1}
\Cref{eqn:equation}
\end{document}
请查看附加的输出
答案1
我们可以定义一个新的diagram
环境并使其与一起工作cleveref
。我假设您希望方程式和图表的计数器相同。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{cd}
\usepackage[colorlinks]{hyperref}
\usepackage[nameinlink]{cleveref}
\newcounter{diagram} % Create counter for diagrams
% Create diagram environment
\newenvironment{diagram}[1][]{%
\begin{equation}%
\begin{tikzcd}[#1]%
\setcounter{diagram}{\theequation}
\addtocounter{diagram}{-1}
\refstepcounter{diagram}
}{%
\end{tikzcd}%
\end{equation}%
}
% Add cleveref information for diagram
\crefname{diagram}{diagram}{diagrams}
\crefname{diagram}{Diagram}{Diagrams}
\creflabelformat{diagram}{(#1) #2 #3}
\begin{document}
\begin{equation}\label{eqn:equation}
y = mx + c
\end{equation}
\begin{diagram}[row sep=2cm, column sep=3cm] \label{dia:diagram}
A \arrow[d] \arrow[r] & B \arrow[d]\\
C \arrow[r] & D
\end{diagram}
\Cref{eqn:equation} \Cref{dia:diagram}
\end{document}
解释
首先,我们定义一个新的计数器,diagram
。每当cleveref
“看到”这个计数器时,它就会知道我们需要一个图表标签。然后我们定义一个环境,diagram
。这包括环境tikzcd
中的环境。环境确保编号和间距与方程式相同。请注意,传递给环境的任何可选参数都会传递给环境。然后我们将计数器设置为与计数器相同的值。然后我们减一,然后一步一步递增并引用equation
equation
diagram
tikzcd
diagram
equation
diagram
(这就是我们需要先减一的原因)。通过这样做后环境equation
启动后,我们确保\label
命令“看到”diagram
计数器。然后,我们通过关闭打开的两个环境来结束环境。
为了cleveref
与diagram
环境协同工作,我们必须做几件事。首先,我们需要告诉cleveref
用什么词来代替“方程式”,这可以通过
\crefname{<type>}{<singular>}{<plural>}
在这种情况下,<type>
是我们正在引用的计数器,因此diagram
和<singular>
/<plural>
是单词的单数/复数形式。下一行是相同的,但使用\Crefname
定义单词的大写版本。我们可以只定义大写或小写,然后再计算出cleveref
另一个版本,但定义两个版本就足够简单了,如果名称更复杂,则cleveref
可能无法找到正确的大写。我们要做的最后一件事是使用
\creflabelformat{<type>}{<format>}
告诉cleveref
如何打印标签,在这种情况下再次<type>
是计数器diagram
,格式是(#1) #2 #3
将数字括在括号中,另外两个与开始hyperref
使用有关clveref
,可以从图像中的红色链接中看到(只需colorlinks
从hyperref
选项中删除即可摆脱颜色)。
我擅自删除了示例图中的空行,并改为设置row sep
和column sep
。
答案2
当打印计数器时(在标题、方程式编号或使用\ref
或 中\cref
),LaTeX 使用内部宏\thecountername
来表示各种计数器名称,例如\theequation
方程式编号和\thechapter
章节编号。
这个宏是计数器和文档中的输出之间的连接,计数器本身是一个内部变量,宏控制如何打印这个变量:例如用阿拉伯数字或罗马数字,但如果在打印表格中添加了任何其他信息,例如节或章节编号。
当您使用 创建新计数器时,\newcounter{diagram}
LaTeX 会自动创建宏\thediagram
,该宏默认定义为\arabic{diagram}
,因此是阿拉伯数字,没有其他内容。 此定义由 拾取\Cref
,因此仅(1)
显示 。 但是,您可以\thediagram
在创建计数器后重新定义自己:
\newcounter{diagram}
\def\thediagram{\thechapter.\arabic{diagram}}
在这个定义中,首先打印章节计数器,然后是句点,然后是图表计数器本身的阿拉伯语表示。这与\theequation
LaTeX 本身的定义非常相似。
完整 MWE:
\documentclass[11pt,twoside]{book}
\usepackage{amsmath}
\usepackage{tikz-cd}
\usepackage[colorlinks]{hyperref}
\usepackage[nameinlink]{cleveref}
\newcounter{diagram}
\def\thediagram{\thechapter.\arabic{diagram}}
\newenvironment{diagram}{\setcounter{diagram}{\value{equation}}\refstepcounter{diagram}}{}
\crefname{diagram}{diagram}{diagrams}
\crefname{diagram}{Diagram}{Diagrams}
\creflabelformat{diagram}{(#1)#2#3}
\begin{document}
\chapter{Diagrams and equations}
\begin{diagram}\label{diagram:diagram}
\begin{equation}
\begin{tikzcd}[sep=large]
A \arrow[dd] \arrow[rrr] & & & B \arrow[dd] \\
& & & \\
C \arrow[rrr] & & & D
\end{tikzcd}
\end{equation}
\end{diagram}
\begin{diagram}
\begin{equation}\label{diagram:diagram1}
\begin{tikzcd}[sep=large]
A \arrow[dd] \arrow[rrr] & & & B \arrow[dd] \\
& & & \\
C \arrow[rrr] & & & D
\end{tikzcd}
\end{equation}
\end{diagram}
\begin{equation}\label{eqn:equation}
y = mx + c
\end{equation}
\Cref{diagram:diagram}
\Cref{diagram:diagram1}
\Cref{eqn:equation}
\end{document}
结果:
请注意,我删除了规范中的空格\creflabelformat
,这些空格显示在输出中。
答案3
\documentclass[11pt,twoside]{book}
%%% Packages
% 1. fonts
\usepackage[T1]{fontenc} % recommended
%\usepackage[utf8]{inputenc} % no longer needed
\usepackage{fix-cm} % for Computer Modern (comment if using the next line)
%\usepackage{newpxtext,newpxmath} % for Palatino
%\usepackage{upgreek} % do you need it?
%\usepackage{charter} % it has no support for math
%\usepackage{relsize} % do you need it?
\usepackage{a4wide}
% 2. Math
\usepackage{stmaryrd}
\usepackage{mathrsfs}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{mathtools}
\usepackage{bm}% bold math
\usepackage[normalem]{ulem}
% 3. Graphics and special effects
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{cd}
\usepackage{tikz-cd}
\usepackage{shadow}% do you need it?
\usepackage{fancybox}% do you need it?
\usepackage{scalerel,stackengine}
\usepackage{eso-pic}
% 4. Document formatting
\usepackage{setspace}
\usepackage{fancyhdr}
\usepackage{appendix}
\usepackage[nottoc]{tocbibind}
\usepackage{alltt}
\usepackage{amsthm}
\usepackage[colorlinks]{hyperref}
\usepackage[nameinlink]{cleveref}
\newcounter{diagram}
\newenvironment{diagram}{\setcounter{diagram}{\value{equation}}\refstepcounter{diagram}}{}
\crefname{diagram}{diagram}{diagrams}
\crefname{diagram}{Diagram}{Diagrams}
\creflabelformat{diagram}{(#1) #2 #3}
\begin{document}
\pagenumbering{roman}
\include{Title}
\newpage
\thispagestyle{empty}
\bigskip{}
\vspace{1cm} \cleardoublepage
\chapter{chapter 1}
\begin{diagram}\label{diagram:diagram}
\begin{equation}
\begin{tikzcd}[sep=large]
A \arrow[dd] \arrow[rrr] & & & B \arrow[dd] \\
& & & \\
C \arrow[rrr] & & & D
\end{tikzcd}
\end{equation}
\end{diagram}
\begin{diagram}
\begin{equation}\label{diagram:diagram1}
\begin{tikzcd}[sep=large]
A \arrow[dd] \arrow[rrr] & & & B \arrow[dd] \\
& & & \\
C \arrow[rrr] & & & D
\end{tikzcd}
\end{equation}
\end{diagram}
\begin{equation}\label{eqn:equation}
y = mx + c
\end{equation}
\Cref{diagram:diagram}
\Cref{diagram:diagram1}
\Cref{eqn:equation}
\end{document}
图表(参考编号)即将发布,但未采用章节编号。请参阅所附照片。
有没有办法获取章节/节号?
答案4
如果我错了,请纠正,因为对我来说这个要求听起来很奇怪。您希望标签始终引用图表的编号,即使您有嵌套的编号元素?
因为这只会引导我\let\refstepcounter\stepcounter
进入环境。但我仍然建议创建一个已经嵌套方程的环境,并使用\tag
方程来访问图表计数器,而不是方程计数器。
完整示例如下...
\documentclass[11pt,twoside]{book}
\usepackage[T1]{fontenc} % recommended
\usepackage{amsmath}
\usepackage{tikz-cd}
\usepackage[colorlinks]{hyperref}
\usepackage[nameinlink]{cleveref}
%as posted by Willoughby which I wouldn't do different
% Add cleveref information for diagram
\crefname{diagram}{diagram}{diagrams}
\crefname{diagram}{Diagram}{Diagrams}
\creflabelformat{diagram}{(#1) #2 #3}
\newcounter{diagram}
\newenvironment{diagram}{\setcounter{diagram}{\value{equation}}\refstepcounter{diagram}%
%let all labels within diagram be set to the diagram counter
\let\refstepcounter\stepcounter
}{}
\renewcommand{\thediagram}{\thesection.\arabic{diagram}}% or replace \thesection by \thechapter
%or if you don't want to use the chapter
%\renewcommand{\thediagram}{\arabic{section}.\arabic{diagram}}
%add resetcounter to equation
\makeatletter
\@addtoreset{equation}{section}% might be replaced by chapter
\renewcommand{\theequation}{\thesection.\arabic{equation}}% might be replaced by \thechapter
\makeatother
\begin{document}
\chapter{to have a chapter number}
\section{to have a section number}
\begin{diagram}\label{diagram:diagram}
\begin{equation}
\begin{tikzcd}[sep=large]
A \arrow[dd] \arrow[rrr] & & & B \arrow[dd] \\
& & & \\
C \arrow[rrr] & & & D
\end{tikzcd}
\end{equation}
\end{diagram}
\begin{diagram}
\begin{equation}\label{diagram:diagram1}
\begin{tikzcd}[sep=large]
A \arrow[dd] \arrow[rrr] & & & B \arrow[dd] \\
& & & \\
C \arrow[rrr] & & & D
\end{tikzcd}
\end{equation}
\end{diagram}
\begin{equation}\label{eqn:equation}
y = mx + c
\end{equation}
\Cref{diagram:diagram}
\Cref{diagram:diagram1}
\Cref{eqn:equation}
\chapter{to have a chapter number}
\section{to have a section number}
\begin{diagram}\label{diagram:diagram}
\begin{equation}
\begin{tikzcd}[sep=large]
A \arrow[dd] \arrow[rrr] & & & B \arrow[dd] \\
& & & \\
C \arrow[rrr] & & & D
\end{tikzcd}
\end{equation}
\end{diagram}
\end{document}