因此,我尝试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}}}