我怎样才能制作一个“真正零高度”的盒子?

我怎样才能制作一个“真正零高度”的盒子?

在我的文档中,我需要在草稿模式下显示一些标签。但它们的高度和深度应为零(目的是不影响结果文本:除标签外,所有标签在草稿和发布模式下都应该相同)。但如果我的标签曾经位于章节标题之前,乳胶不会省略前导\vspace。这是一个 MWE:

\documentclass[12pt]{report}
\usepackage[english]{babel}
\begin{document}
\vspace{3cm}
Here we see that \verb'\vspace' omits.\pagebreak

\vbox to 0pt{\raisebox{0pt}[\height][0pt]{some text}}
\vspace{3cm}
But here it presents!

\end{document}

甚至技巧也对\raisebox我没用。

我看到的唯一变体是\newif像在宏中\ifomitvspace那样\omitvspacetrue创建注释,然后\title进行检查,并且不执行\vspaceif \ifomitvspace。要关闭此功能,我应该这样做\everypar{\omitvspacefalse}。但我认为这很丑陋。

更新型多巴胺paracol不幸的是,我没有找到在环境 中垂直空间内挣扎的方法。由于它重新定义了\everypar,David Carlisle 的答案不起作用。我猜使用一些标志并重新定义 \@vspace 也不起作用(因为它省略了全部空格而不是只有顶部)。这很可悲。

答案1

总的来说,这很棘手,您可以看看颜色或 showkeys 包如何尝试避免影响原始文本的位置(但没有完全成功)。

代码expl3 l3galley通过完全控制垂直模式来解决这个问题,如果一切都遵守规则,它就会起作用,但是在 latex2e 中,可以不受限制地访问 latex 和 tex 基元,将垂直列表添加到其中,这实际上不是一个选择。

我会推迟任何垂直模式的使用,直到下一段开始,那时事情更容易控制:

在此处输入图片描述

\documentclass[12pt]{report}
\usepackage[english]{babel}
\let\oldeverypar\everypar
\oldeverypar{\the\everypar\the\mynotes\global\mynotes{}}
\newtoks\mynotes
\protected\long\def\mynote#1{%
\ifvmode
\global\mynotes\expandafter{\the\mynotes\smash{\raise\baselineskip\rlap{#1}}}%
\else
\smash{\raise\baselineskip\rlap{#1}}%
\fi}

\newtoks\everypar
\begin{document}
\vspace{3cm}
Here we see that \verb'\vspace' omits.\pagebreak

\mynote{some text}
\vspace{3cm}
But here it presents!

\end{document}

相关内容