我有一些宏想在我的序言中设置。问题是它们需要知道典型的文本行将出现在文档中。
如果我做类似的事情,
%% 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}
产量
经过两次运行。