我正在写一篇论文,想要一个具有以下属性的环境。如果在序言中将某个标志设置为“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}
我不确定如何在环境中做到这一点,但至少它对于简单的事情有效。