![自定义环境的重复标签](https://linux22.com/image/342632/%E8%87%AA%E5%AE%9A%E4%B9%89%E7%8E%AF%E5%A2%83%E7%9A%84%E9%87%8D%E5%A4%8D%E6%A0%87%E7%AD%BE.png)
我已经定义了一个自定义环境,其中有一个显示或不显示标题的选项(使用该\xifthen
包,我不确定这是否是最好的方法,但到目前为止有效)。
\documentclass{report}
\usepackage{xifthen}
\newcounter{mycnt}[chapter]%
\renewcommand{\themycnt}{\thechapter.\arabic{mycnt}}
\newenvironment{myenv}[1][]{%
\ifthenelse{\equal{#1}{notitle}}
{\par\medskip\noindent}
{
\refstepcounter{mycnt}%
\par\medskip\noindent\textbf{Test\ \themycnt}%
\par\medskip\noindent}
}{%
\par\medskip\ignorespacesafterend\noindent%
}
\begin{document}
\chapter{Introduction}
\section{A Section}
Some text
\begin{myenv} \label{test:one}
Some text within environment (why does it begin with that weird space?)
\end{myenv}
As Test~\ref{test:one} demonstrates ...
\begin{myenv}[notitle]
Some text within environment with no title
\end{myenv}
\begin{myenv} \label{test:two}
Some text within environment
\end{myenv}
As Test~\ref{test:two} demonstrates ...
\section{Another Section}
Now let us look again at Test~\ref{test:one} already shown in the previous section:
\begin{myenv} % maybe another option, such as [repeated] ?
Some text within environment (how to get this to be repeated as Test 1.1?)
\end{myenv}
\end{document}
现在,除了不显示标题(因此也不会计入计数器)的选项之外,在我的文档中,我还希望能够有第二个选项来重复之前已经打印的环境的内容,以便我可以再次参考测试 1.1,例如,在后续章节中,但仍然反映它第一次出现的编号,即 1.1。
顺便说一句,环境变量的第一行似乎也有一个奇怪的空格,我不知道它从哪里来的。有人能发现这个错误吗?
笔记:最后,我计划使用环境来包含各个部分\input{filename.tex}
。理想情况下,我希望\begin{myenv} label{somelabel}
在其中有行filename.tex
,因此如果有一种方法可以让它在找到重复的标签时自动重复编号,那就太好了。还是要求太多了?如果这太复杂,我也可以先设置\begin
我的环境,然后再\input
设置文件。
编辑:也许对于后一种情况,实际上最好不要将\begin
、\label
和\end
文件内的环境设置为 ,\input
而是定义一个以 为参数的命令{filename}
并执行
\begin{myenv}\label{#1}\input{#1}\end{myenv}
尽管如此,我首先需要帮助弄清楚如何实现允许我重复环境的选项。任何建议都非常感谢。
编辑2:澄清:理想情况下,我希望有三个重复环境的选项。
(1)没有标题的内容(这种方法很好,我已经实现了,但也许有更好的方法):
\begin{myenv}[notitle]\input{file1}\end{myenv}
(2)重复相同的内容,也重复相同的标题。
\begin{myenv}[repeatedtitle]\input{file1}\end{myenv}
(3)只重复部分内容(即\input
不同的文件)但重复标题。
\begin{myenv}[repeatedtitle]\input{partoffile1}\end{myenv}
答案1
我建议使用略有不同的键值方法作为环境接口。定义的键包括
title
:一个布尔键,可以为 true (默认)或 false,用于设置标题测试 XY或不。notitle
: 如同title=false
label
:相当于\label
在环境内部设置一个repeat
label
:重复标题中使用的现有名称。
\documentclass{report}
\usepackage{xkeyval}
\makeatletter
\define@boolkey{fam}[myenv@]{title}[true]{}
\define@boolkey{fam}[myenv@]{notitle}[true]{\ifmyenv@notitle\myenv@titlefalse\else\myenv@titletrue\fi}
\define@cmdkey{fam}[myenv@]{label}[\relax]{}
\define@cmdkey{fam}[myenv@]{repeat}[\relax]{}
\newcounter{mycnt}[chapter]%
\renewcommand{\themycnt}{\thechapter.\arabic{mycnt}}
\newenvironment{myenv}[1][]{%
\setkeys{fam}{title,label,repeat,#1}%
\ifmyenv@title
\par\addvspace{\medskipamount}%
\expandafter\ifx\myenv@repeat\relax
\refstepcounter{mycnt}%
\expandafter\ifx\myenv@label\relax\else\label{\myenv@label}\fi
\else
\renewcommand{\themycnt}{\ref{\myenv@repeat}}%
\fi
\noindent\textbf{Test\ \themycnt}%
\par\nobreak\addvspace{\medskipamount}%
\else
\par\addvspace{\medskipamount}%
\fi
\edef\@currentlabel{\themycnt}%
\noindent\ignorespaces
}{%
\par\addvspace{\medskipamount}\ignorespacesafterend
}
\makeatother
\begin{document}
\chapter{Introduction}
\section{A Section}
Some text
\begin{myenv}[label={test:one}]
A: Some text within environment
\end{myenv}
As Test~\ref{test:one} demonstrates ...
\begin{myenv}[notitle]
B: Some text within environment with no title
\end{myenv}
\begin{myenv}[label={test:two}]
C: Some text within environment
\end{myenv}
As Test~\ref{test:two} demonstrates ...
\section{Another Section}
Now let us look again at Test~\ref{test:one} already shown in the previous section:
\begin{myenv}[repeat={test:one}]
D: Some text within environment
\end{myenv}
\end{document}
你需要用来%
避免虚假的空间label
。这已作为键值功能的一部分得到处理。