如何确定盒子的垂直极限?

如何确定盒子的垂直极限?

我使用 marginpar 将图表和表格放在文档的页边空白处。有时,我最终会在页面底部开始一个长注释,但它会超出底部。为了解决这个问题,我可以在 marginpar 之前添加一些负 vspace。但是,如果编辑将 marginpar 移动到下一页的顶部,它就会开始得太高。因此,当我编辑完文档时,我需要返回并检查每一页,以确保没有任何东西太离谱。

我想做的是添加一个测试来查看 marginpar 是否开始得太高或结束得太低。如果是这样,我会在日志文件中放置一条警告消息。然后我将能够搜索日志文件以查看是否有任何 marginpar 位置不对,并手动修复它们的位置。我如何测试盒子的顶部或底部是否太高或太低?这是一个 MWE:

\documentclass{article}
\usepackage[textheight=8in,textwidth=4in]{geometry}
\usepackage{lipsum}
%\usepackage{ifthen}
\newcommand{\mnote}[2][0ex]{%
    \marginpar{\vspace{#1}%
    \begin{minipage}[c]{\marginparwidth}
%       \ifthenelse{currentlocation.y < texttop}{\typeout{marginpar too high on page \thepage}}{}
        #2
%       \ifthenelse{currentlocation.y > textbottom}{\typeout{marginpar too low on page \thepage}}{}
    \end{minipage}%
}}

\begin{document}

\lipsum[1-4]

A paragraph at the bottom of the page
\mnote{\lipsum[5]}
with a long note that goes too low on the page.

\lipsum[6]

A paragraph at the top of the page
\mnote[-3in]{\lipsum[7]}
where the note has been moved too high up.

\end{document}

答案1

您可以使用\pdfsavepos原始(或它的新名称,\savepos如果您使用最新的 luatex)来测试最终的排版位置。

这些值是以页面底部某个参考点为基准的,您可以直接用眼睛调整,也可以使用类似

 \pdfsavepos\write20{here=\the\pdflastypos}

在参考点(例如页面的第一行或最后一行)处获取用作边界的数字,\toptest\bottest

正如这里发布的那样,它会产生一个日志

Package mnote Warning: marginpar 1 very low on page 1.


Package mnote Warning: marginpar 2 very high on page 2.


\documentclass{article}
\usepackage[textheight=8in,textwidth=4in]{geometry}
\usepackage{lipsum}
%\usepackage{ifthen}
\newcounter{mpcount}
\makeatletter
\newcommand{\mnote}[2][0ex]{%
    \marginpar{\vspace{#1}%
    \begin{minipage}[c]{\marginparwidth}
\stepcounter{mpcount}%
\strut\pdfsavepos\write\@auxout{\string\toptest{\thempcount}{\thepage}{\the\pdflastypos}}%
        #2\ifhmode\unskip\fi
\strut\pdfsavepos\write\@auxout{\string\bottest{\thempcount}{\thepage}{\the\pdflastypos}}%
    \end{minipage}%
}}
\def\toptest#1#2#3{\ifnum#3> 50000000
\PackageWarningNoLine{mnote}{marginpar #1 very high on page #2}%
\fi}
\def\bottest#1#2#3{\ifnum#3< 0
\PackageWarningNoLine{mnote}{marginpar #1 very low on page #2}%
\fi}

\makeatother

\begin{document}


\lipsum[1-4]

A paragraph at the bottom of the page
\mnote{\lipsum[5]}
with a long note that goes too low on the page.

\lipsum[6]

A paragraph at the top of the page
\mnote[-3in]{\lipsum[7]}
where the note has been moved too high up.

\end{document}

相关内容