假设我有一个环境redacted
,我想以这种方式声明:
\begin{redacted}
This is some secret content.
\end{redacted}
我希望结果相当于在环境内部传递文本minipage
,然后\phantom{}
\begin{minipage}[1.0\textwidth]
\phantom{This is some secret content.}
\end{minipage}
以下声明给出错误,因为花括号不匹配
\newenvironment{redacted}
{
\begin{minipage}[1.0\textwidth]
\phantom{
}
{
}
\end{minipage}
}
有什么方法可以实现这一点吗?
答案1
我相信你想要这样的东西。请注意,我把放在里面minipage
而\phantom
不是反过来,因为当在非数学模式下调用时,\phantom
会以受限水平模式(LaTeX 术语中的 LR 模式)排版其参数,因此使用\phantom{\BODY}
总是会得到一行(可能非常长)。
\BODY
收集用 声明的环境的主体\NewEnviron
。此宏来自非常方便的environ
包。
\documentclass{article}
\usepackage{environ}
\usepackage{lipsum}
\NewEnviron{redacted}{%
\par\noindent
\phantom{%
\begin{minipage}{\linewidth}
\BODY
\end{minipage}%
}%
\par
}
\begin{document}
Before.
\begin{redacted}
\lipsum[1]
\end{redacted}
After.
\end{document}
答案2
与 frougon 的答案类似,另一种选择是使用xparse
带有参数类型的包b
,它首先扫描环境主体,以便它可以用作环境定义中的普通参数:
\documentclass{article}
\usepackage{xparse}
\usepackage{lipsum}
\NewDocumentEnvironment{redacted}{b}{%
}{%
\phantom{%
\begin{minipage}{1.0\textwidth}%
#1%
\end{minipage}%
}%
}
\begin{document}
\lipsum[1]
\begin{redacted}
This is\\
some\\
secret content.
\end{redacted}
\lipsum[2]
\end{document}