有条件地将文本发送到附录的环境?

有条件地将文本发送到附录的环境?

我正在写一篇论文,想要一个具有以下属性的环境。如果在序言中将某个标志设置为“true”,则该环境中包装的所有文本都将发送到附录。如果该标志为“false”,则文本将内联放置。理想情况下,还可以将文本发送到附录的特定子部分(特定子部分可以作为环境的参数?)。这样的东西已经存在了吗?我的理想用法是这样的:

\documentclass{article}
\ifappendix[true]

\begin{document}

This text is always in the main body of the paper.

\begin{maybeappendix}[~\ref{sec:appendix-subsection}]
This text is produced inline if \ifappendix[false], thrown into the subsection ~\ref{sec:appendix-subsection} if \ifappendix[true].
\end{maybeappendix}

\appendix
\section{Section Name}\label{ref:appendix-subsection}
\end{document}

我试图定义一个可以执行此操作的新命令,如下所示:

\documentclass{article}
\usepackage{etoolbox}

 \newif\iffull
 \fulltrue

 \newcommand{\condloc}[2]{\newcommand{#1} {\iffull{#2}\else{\preto#1{#2}}\fi}}

 \begin{document}


 \condloc{\where}{Text Should be inserted before app if full is true,
   after app if full false.}

 \section{app}
 \where
\end{document}

如果 full 为假,则不渲染任何内容,如果为真,则将文本放置在我想要的位置,而不是将文本放置在预期的位置(如果 full 为真,则放置在应用程序之前,如果 full 为假,则放置在应用程序之后)。

答案1

这应该可以解决问题。

\documentclass{article}

% Beginning of definitions
\usepackage{environ}

\newif\ifappendix
\NewEnviron{maybeappendix}[1]
    {\ifappendix
        \expandafter\global\expandafter\let\csname putmaybeappendix#1\endcsname\BODY%
    \else
        \expandafter\newcommand\csname putmaybeappendix#1\endcsname{}\BODY%
    \fi}
\newcommand{\putmaybeappendix}[1]{\csname putmaybeappendix#1\endcsname}
% End of definitions

\appendixtrue

\begin{document}

Main body

\begin{maybeappendix}{label}
Movable text
\end{maybeappendix}

\appendix
\section{Section name}
\putmaybeappendix{label}

\end{document}

更改\appendixtrue\appendixfalse以将文本放置在原来的位置(或者直接删除它,就像\appendixfalse默认的那样(要更改默认设置,请\appendixtrue在后面添加\newif\ifappendix))。

它似乎支持可移动文本中的多个段落甚至图形:)


如果要收集具有相同标签的多个文本,请使用以下定义(上述代码将丢弃具有该标签的旧文本):

\usepackage{environ,etoolbox}

\newif\ifappendix
\NewEnviron{maybeappendix}[1]
    {\ifcsname putmaybeappendix#1\endcsname
    \else
        \expandafter\gdef\csname putmaybeappendix#1\endcsname{}
    \fi
    \ifappendix
        \expandafter\xdef\csname putmaybeappendix#1\endcsname{\expandafter\expandonce\csname putmaybeappendix#1\endcsname\unexpanded{\par}\expandonce\BODY}
    \else
        \BODY%
    \fi}
\newcommand{\putmaybeappendix}[1]{\csname putmaybeappendix#1\endcsname}

\par然后将所有文本收集起来并在附录中分开(如果不需要,只需从定义中\par删除)。\unexpanded{\par}

答案2

因此,这是一个不太好的解决方法,但以下会产生预期的后果:

\documentclass{article}
\usepackage{etoolbox}

\newif\iffull
\fullfalse

\newcommand{\condloc}[2]{\newrobustcmd{#1} \protect{\iffull{#2}\else{\gpreto#1{#2}}\fi}}

\begin{document}
\condloc{\where}{Text Should be inserted before app if full is true, after app if full false.}

\section{App}
\where
\end{document}

我不确定如何在环境中做到这一点,但至少它对于简单的事情有效。

相关内容