自定义环境的重复标签

自定义环境的重复标签

我已经定义了一个自定义环境,其中有一个显示或不显示标题的选项(使用该\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在环境内部设置一个

  • repeatlabel:重复标题中使用的现有名称。

在此处输入图片描述

\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。这已作为键值功能的一部分得到处理。

相关内容