问题: 我想创建一个名为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
}%