使用 \renewcommand 重新定义 marginpar

使用 \renewcommand 重新定义 marginpar

因此,我尝试marginpar通过使边距文本以斜体显示来修改默认命令。现在,仅以下操作不起作用:

\renewcommand{\marginpar}[1]{\marginpar{\textit{#1}}}

对我来说这似乎很简单。使用默认定义的\marginpar{}相同命令更新命令\marginpar{},并使用参数通过斜体部分展开它。正如我提到的,这不起作用。

但这确实有效:

\let\oldmarginpar\marginpar
\renewcommand{\marginpar}[1]{\oldmarginpar{\textit{{#1}}}}

所以我的问题是,为什么需要这一步来定义一个引用的命令marginpar,然后用重新定义该替代命令renewcommand。这个过程对我来说毫无意义。

答案1

要理解 TeX 的工作方式,你必须记住它本质上是一种宏扩展语言,你的世界观具有“与\marginpar{}默认定义相同”的概念,与 TeX 的世界观根本不对应。

根据你的定义,给出

\marginpar{123}

TeX 看到第一个标记并将其替换为其定义,因此

\marginpar{\textit{123}}

然后 TeX 开始再次处理该流,看到第一个标记,就\marginpar用其定义替换它

\marginpar{\textit{\marginpar{\textit{123}}}}

并且您陷入了永无止境的循环。如果您想保存旧定义,则需要明确执行此操作,正如您所发现的那样。

答案2

因为您在这里所做的是“文本替换”,即您的定义是这样的......

\marginpar{test} -> \marginpar{\textit{test}} -> \marginpar{\textit{\marginpar{\textit{test}}} -> ...

等等。\let第二段代码摘录保存了定义变成。\marginpar然后\oldmarginpar,新的\marginpar使用旧的定义加上你的斜体命令。

答案3

最好不要重命名 TeX 或 LaTeX 基元,请尝试以下方法:

\DeclareRobustCommand{\sidepar}[1]{\marginpar{\textit{#1}}}
\sidepar{test it}

答案4

在我看来,原始发帖者的问题已经解决了。作为一个小补充,以下 marginpar 变体对我来说效果很好:我使用 marginpars 来跟踪文本中的注释,标记需要进一步处理的内容。为了能够找到它们,我添加了索引,并可以选择完全禁用它们的输出

% Define new command \marpar to replace  \marginpar.
% usage is identical, \marpar will print the marginpar in fnsize
% (footnotesized) text, which makes the sometimes lengthy comments less
% obtrusive and improves legibility.
% Add indexing of marpars

\newcommand{\marpar}[1]{\marginpar{\fnsize #1}\index{TODO}}

我喜欢使用 opt 环境来允许使用标签切换:

\newcommand{\marpar}[1]{\opt{note}{\marginpar{\fnsize #1}\index{TODO}}}

如果不能使用 opt 环境,则抑制这些修改后的 marginpars 的输出的另一种方法是将 marginpar 隐藏在永远不会被调用的宏中。

\newcommand{\marpar}[1] {{\newcommand{\lastunprintedcommand}{\marginpar #1}}}

相关内容