使用 environ 和 TikZ 包创建的自定义环境的交叉引用

使用 environ 和 TikZ 包创建的自定义环境的交叉引用

问题: 我想创建一个名为Example的环境,该环境有一个计数器(章节内的数字)。我想像表格、图形和公式环境一样引用计数器进行说明。

使用 时\newenvironment,该命令\refstepcounter有效。但是,由于新环境包含 TikZ 代码,因此我无法使用它\newenvironment来创建环境。或者,我使用了环境包。唯一的问题是计数器的交叉引用不起作用,即使我\refstepcounter在自定义环境中使用。

例子 最小示例如下:

\documentclass{book}

\usepackage{lipsum}
\usepackage{mathpazo}

\newcounter{exam}[chapter]
\setcounter{exam}{0}
\renewcommand{\theexam}{\thechapter.\arabic{exam}}

% % Method 1

% \newenvironment{example}[1][]{\refstepcounter{exam}\par\medskip\noindent%
%    \textbf{Example \theexam~ #1} \rmfamily}{\medskip}

% Method 2
\usepackage{environ,tikz}
\tikzstyle{title}=[right=10pt,fill=gray,text=green!50]
\tikzstyle{context}=[thick,rectangle,draw=gray,inner sep=10pt, inner ysep=10pt]
\NewEnviron{example}[1][{}]{%
\par\noindent\centering
\begin{tikzpicture}
    \node[context](box){
        \begin{minipage}{0.93\textwidth}
            \BODY
        \end{minipage}};
    \node[title] at (box.north west){
    \refstepcounter{exam}\par\medskip\noindent \textbf{Example \theexam~ #1}};
\end{tikzpicture}}

\begin{document}

\setcounter{chapter}{2}

\begin{example}[First]\label{exam:1}
    \lipsum[4]
\end{example}

\lipsum[2]

\begin{example}[Second]\label{exam:2}
  \lipsum[5]
\end{example}

Example ~\ref{exam:1} and ~\ref{exam:2} are the new environments!

\end{document}

方法1可行,但是方法2无效。我怎样才能让它工作?

附加信息:如果可能的话,我会尽量不使用定理或者彩色盒子

谢谢你!

答案1

\refstepcounter应该使用 \label.\refstepcounter定义了\@currentlabel所使用的\label

\documentclass{book}

\usepackage{lipsum}
\usepackage{mathpazo}

\newcounter{exam}[chapter]
\setcounter{exam}{0}
\renewcommand{\theexam}{\thechapter.\arabic{exam}}

% % Method 1

% \newenvironment{example}[1][]{\refstepcounter{exam}\par\medskip\noindent%
%    \textbf{Example \theexam~ #1} \rmfamily}{\medskip}

% Method 2
\usepackage{environ,tikz}
\tikzstyle{title}=[right=10pt,fill=gray,text=green!50]
\tikzstyle{context}=[thick,rectangle,draw=gray,inner sep=10pt, inner ysep=10pt]
\NewEnviron{example}[1][{}]{%
    \par
    \centering
    \addvspace{\medskipamount}%
    \begin{tikzpicture}
        \node[context](box){%
            \begin{minipage}{0.93\textwidth}
                \refstepcounter{exam}%
                \BODY
            \end{minipage}};
        \node[title] at (box.north west){\textbf{Example \theexam\ #1}};
    \end{tikzpicture}%
    \par
}

\begin{document}

\setcounter{chapter}{2}

\begin{example}[First]\label{exam:1}
    \lipsum[4]
\end{example}

\lipsum[2]

\begin{example}[Second]\label{exam:2}
    \lipsum[5]
\end{example}

Example~\ref{exam:1} and~\ref{exam:2} are the new environments!

\end{document}

结果

评论:

  • Example ~\ref{...}空格,第一个允许换行。使用~代替空格:Example~\ref{...}

  • \par\noindent\centering:TeX 使用段落末尾的设置。但是,组在段落结束前关闭,因此\centering示例框未居中。上例在 之后立即关闭段落\end{tikzpicture}。然后居中起作用,\noindent不需要(\parindent设置为零\centering)。

  • 我在示例的开头进行了移动\medskip。在节点内部,\hbox它不会添加垂直空间。

如果您想要获得示例环境的完整线宽,则minipage可以计算环境的宽度:

\begin{minipage}{%
    \dimexpr
        \linewidth % available text width
        -\pgfkeysvalueof{/pgf/inner xsep}*2 % inner margin of the frame
        -2\pgflinewidth % rule width of the frame
    \relax   
}%

相关内容