扩展至其参数长度的宏

扩展至其参数长度的宏

如果我想匿名化我为审阅而撰写的论文,我不仅仅想从作者字段中删除我的名字。我想用一个与大写字母一样高、与我的名字一样长的规则来替换我的名字。这样,看起来我的名字就被从历史记录中删掉了。(我其实不会这样做……)以下是 MWE:

\documentclass[12pt]{article}
\usepackage{lipsum}
\newlength\namelength
\settowidth\namelength{Seamus Bradley}
\title{A paper with no author}
\author{\rule{\namelength}{12pt}}
\begin{document}
\maketitle
\lipsum
\end{document}

现在问题来了。我该如何定义一个\lengthof宏来查看其参数然后将其扩展为该长度?由于您不能将 a 放在\settowidtha 里面\rule(或者我尝试时它不起作用),所以这并不像我想象的那么简单……

有办法做到这一点吗?或者没有好方法可以做到这一点的充分理由是什么?

答案1

首先让我回答标题中的问题:您不能将宏扩展为其参数的宽度/长度,因为您需要为此进行分配。

在其他答案(都很好)\widthof的论点中起作用的原因是,它使用了解析其论点的版本并且不需要可扩展性。\rulecalc\setlength

因此,我假设您可能不介意这一点,只想获取某些文本的宽度。所有提到的宏都只是将参数放入 TeX 框中,然后对其使用 、\ht\dp分别\wd获取高度、深度和宽度。如果您需要其中多个,自己框定内容会更有效率(请参阅 Herbert 更新的答案)。

这是我的解决方案,修改普通\phantom宏以生成规则,而不是通常的空框。这样做的好处是,它重新使用现有\phantom代码,以便在数学模式下也能正常工作。

\documentclass{article}

\makeatletter
\def\rulephantom#1{%
    \begingroup
    \def\finph@nt{\vrule\@width\wd\z@\@height\ht\z@\@depth\dp\z@}%
    \phantom{#1}%
    \endgroup
}
\makeatother

\parindent=0pt
\begin{document}

Text

\rulephantom{Text} Text

\rulephantom{Text\strut} Text

$ \rulephantom{Text} Text $

\end{document}

答案2

\documentclass[12pt]{article}
\usepackage{calc}
\usepackage{lipsum}
\newcommand*{\anonauthor}[1]{\rule{\widthof{#1}}{\totalheightof{#1}}}
\title{A paper with no author}
\author{\anonauthor{Seamus Bradley}}
\begin{document}
\maketitle
\lipsum
\end{document}

编辑:Herbert 速度更快。但是,\totalheigthof将使规则的高度与基本字体大小成比例(如果这对您很重要)。

编辑 2:具有正确垂直对齐的宏变体(效率低下?):

\newcommand*{\anonauthor}[1]{\rule[\depthof{#1}*{-1}]{\widthof{#1}}{\totalheightof{#1}}}

答案3

在你的情况下,这可能有点过头了,但还有censor使用以下命令生成这些条的包\censor

\documentclass[12pt]{article}
\usepackage{lipsum}
\usepackage{censor}
\title{A paper with no author}
\author{\censor{Seamus Bradley}}
\begin{document}
\maketitle
\lipsum
\end{document}

答案4

\documentclass[12pt]{article}
\usepackage{calc}
\newsavebox\TBox
\def\phantomrule#1{\sbox\TBox{#1}\rule[-\dp\TBox]{\wd\TBox}{\ht\TBox+\dp\TBox}}

\title{A paper with no author}
\author{\phantomrule{Seamus Bradley}By}

\begin{document}
\maketitle
\end{document}

相关内容