请考虑以下示例:
\documentclass{article}
\begin{document}
Text A.
\vspace*{5cm}
Text B
\end{document}
现在我想将其更改为
\documentclass{article}
\usepackage{environ}
\usepackage{lipsum}
\NewEnviron{eatnospace}{
%% Some missing code to make it work
\BODY
}
\begin{document}
Text A.
\begin{eatnospace}
Some text that doesn't move "Text B" down:
\lipsum[2]
\end{eatnospace}
\vspace*{5cm}
Text B
\end{document}
即我想定义一个eatnospace
不影响主文档垂直空间的环境。背景是我想为同事做的数学测试添加解决方案。在原始测试中,有一些垂直空间(例如\vspace*{5cm}
)用于学生答案。
现在我想使用原始源代码将解决方案写入这些空间,同时尽可能少地进行更改。
我怎样才能做到这一点?
更新:
eatnospace
使用@David Carlisle 的建议,我尝试这样定义:
\NewEnviron{eatnospace}{
\vadjust{\smash{\parbox[t]{\textwidth}{
\BODY
}}}
}
但是它会引发一个错误“您不能在垂直模式下使用‘\vadjust’。”
答案1
指某东西的用途\vadjust
没有意义(这就是为什么好的最小工作示例很重要:您最初的问题将所有内容都放在同一段中,这就是 David Carlisle 建议您使用\vadjust
仅在水平模式下有用的示例的原因。通过澄清您的问题,很明显您很可能打算在垂直模式下使用此环境。)
\documentclass[twocolumn]{article}
\usepackage{environ}
\usepackage{lipsum}
\NewEnviron{eatnospace}{
\par\noindent\smash{\parbox[t]{\linewidth}{\BODY}}\par\vskip-\baselineskip
}
\begin{document}
Text A.
\begin{eatnospace}
Some text that doesn't move ``Text B'' down:
\lipsum[2]
\end{eatnospace}
\vspace*{6.5cm}
Text B
\begin{eatnospace}
This happens if you over flow
\[ f(b) - f(a) = \int_a^b f'(x) ~dx \]
\lipsum[1]
\end{eatnospace}
\vspace*{4cm}
Text C
\newpage
Text A.
\vspace*{6.5cm}
Text B
\vspace*{4cm}
Text C
\end{document}
替代解决方案
然而,在我看来,当你可以告诉 具有正确的高度时,粉碎 a\parbox
并手动插入似乎有点愚蠢。在此过程中,我们还可以添加一个开关来隐藏解决方案,因此将来您只需拥有一份文档副本并使用它来构建测试和解决方案。\vspace*
\parbox
\documentclass[twocolumn]{article}
\usepackage{environ}
\usepackage{lipsum}
\newif\ifshowsolution
\showsolutiontrue % change to \showsolutionfalse to hide solutions
\NewEnviron{eatnospace}[1]{
\par\noindent\parbox[t][#1]{\linewidth}{\ifshowsolution\BODY\fi}\par
}
\begin{document}
Text A.
\begin{eatnospace}{6.5cm}
Some text that doesn't move ``Text B'' down:
\lipsum[2]
\end{eatnospace}
Text B
\begin{eatnospace}{4cm}
This happens if you over flow
\[ f(b) - f(a) = \int_a^b f'(x) ~dx \]
\lipsum[1]
\end{eatnospace}
Text C
\newpage
Text A.
\vspace*{6.5cm}
Text B
\vspace*{4cm}
Text C
\end{document}