如何从序言中获取文本的宽度?

如何从序言中获取文本的宽度?

我有一些宏想在我的序言中设置。问题是它们需要知道典型的文本行将出现在文档中。

如果我做类似的事情,

%% Everything set up correctly
\documentclass{article}
\usepackage[margin=1in,showframe]{geometry}
\setlength{\parindent}{0pt}

\newlength{\testlength}
\setlength{\testlength}{\textwidth}
\newcommand{\myrule}{\rule{\testlength}{4pt}}

\usepackage{lipsum}
\begin{document}

\myrule

\lipsum[1-10]

\end{document}

然后\myrule就有正确的宽度。

但如果我做类似的事情

%% FAIL
\documentclass{article}
\usepackage[margin=1in,showframe,twocolumn]{geometry}
\setlength{\parindent}{0pt}

\newlength{\testlength}
\setlength{\testlength}{\textwidth}
\newcommand{\myrule}{\rule{\testlength}{4pt}}

\usepackage{lipsum}
\begin{document}

\myrule

\lipsum[1-10]

\end{document}

我没有得到想要的结果。

我可能倾向于将宏的宽度设置为

\setlength{\testlength}{\linewidth}

或者

\setlength{\testlength}{\columnwidth}

但这两者都未能获得正确的长度(除了\linewidth,据我理解,在序言中实际上没有太多意义)。

我的宏如何从序言中知道正确的文本宽度应该是多少?

我应该指出,我并不特别关心如果宏在包multicols的环境中被调用会发生什么multicol。换句话说,宏应该有一个绝对长度,而不是相对于特定环境的长度。

答案1

您可以将感兴趣的长度写入文件aux并在下次检索它:

\documentclass{article}
\usepackage[margin=1in,showframe,twocolumn]{geometry}
\setlength{\parindent}{0pt}

\newlength{\testlength}

\makeatletter
\def\getlength{\immediate\write\@mainaux{\noexpand\global\noexpand\testlength=\the\linewidth}}
\makeatother

\newcommand{\myrule}{\rule{\testlength}{4pt}}

\usepackage{lipsum}
\begin{document}

\getlength
\myrule

\lipsum[1-10]

\end{document}

产量

TeXed 示例的裁剪版本

经过两次运行。

相关内容