我使用边距打印关键字,但有时段落中的关键字数量过多,它们会出现在下一段旁边。为了避免这个问题,我想也许可以这样处理:如果边距中的文本与它们对应的文本在\marginpar
同一行上,则用逗号而不是换行符分隔它们。
例如,假设我写道:
Some text A\marginpar{X} and B\marginpar{Y}
在输出中,A 和 B 打印在同一行。然后我想在边距区域显示“X,Y”,而不是一行显示“X”,下一行显示“Y”。
有没有办法修改\marginpar
或定义一个新命令来实现这个目的?
答案1
我不知道是否有办法自动完成此操作:我认为 TeX 格式化整个段落的方式,仅在段落完成时决定换行符,会阻止任何简单的本地知识,即两个单词(或插入单词之间的宏)是否会出现在同一行文本上。
但是,我可以提供下一个最佳解决方案:一个宏,它允许您手动(但尽可能简单)确定哪些边注应放在同一个内\marginpar
。
带有连续边注的宏
以下是两个宏,它们之间只有一个星号不同。虽然必须仔细检查文档才能为命令添加星号,但希望您能轻松找到(或猜出)一些应该添加星号的地方,并适当修改源代码。
句法: \marnote{ ... }
或者\marnote*{ ... }
无星号的宏会创建新的边注。有星号的版本会添加要包含在先前定义的边注中的材料。这两个命令都接受其参数,并编写一个命令以从辅助文件中读取,从而构建给定边注的内容。
带星号的版本在辅助文件中写入注释,该注释附加到已包含一些材料的标记列表的末尾。两个版本都获取正在构建的标记列表的内容,并定义一个命名宏来表示所需边注的内容。在编译时,辅助文件将该宏的内容定义为什么,都会进入边注。由于辅助文件的内容可能落后于文档本身,因此每次更改边注后都需要进行几次编译(编辑器可能会或可能不会自动执行)。
代码:
\makeatletter
\newcounter{marnote}
\setcounter{marnote}{0}
\newtoks\marnote@toks
\def\marnote{\@ifstar{\marnote@continue}{\marnote@new}}
\def\marnote@new#1{%
\@bsphack
\fix@marnote
\stepcounter{marnote}%
\expandafter\put@marnote\expandafter{marnote@\the\c@marnote}%
\protected@write\@auxout{}{\string\newmarnote{#1}}%
\@esphack}
\def\marnote@continue#1{%
\@bsphack\protected@write\@auxout{}{\string\continuemarnote{#1}}\@esphack}
\def\put@marnote#1{%
\marginpar{%
\@ifundefined{#1}%
{\nfss@text{\reset@font\marnotestyle\bfseries ??}}%
{\csname #1\endcsname}%
}}
\def\fix@marnote{%
\ifnum\c@marnote>0\protected@write\@auxout{}{\string\savemarnote\the\c@marnote}\fi}
\def\newmarnote#1{%
\marnote@toks={\marnotestyle {#1}}}%
\def\continuemarnote#1{%
\marnote@toks=\expandafter{\the\marnote@toks\marnotedelim#1}}%
\def\savemarnote#1{%
\def\@tempa{\expandafter\gdef\csname marnote@#1\endcsname}%
\expandafter\@tempa\expandafter{\the\marnote@toks}}%
\AtEndDocument{\@bsphack\fix@marnote\@esphack}
\makeatother
\newcommand\marnotestyle{\footnotesize}
\newcommand\marnotedelim{, }
请注意最后定义的两个宏,它们允许您修改边注的排版方式。
示例文档
将上述代码包含在以下文档的序言中 — — 或将以下内容复制到新文档中,位于上述边注宏之后。
\documentclass{article}
% For some "dummy" text at the end of the document
\usepackage[english]{babel}
\usepackage{blindtext}
% Some geometric parameters to better show off the margin notes
\usepackage[right=8cm,textwidth=7cm,marginparwidth=6cm, marginparsep=5mm]{geometry}
% This allows the margin notes to align as well as possible with the lines of text
\setlength\marginparpush{0pt}
\begin{document}
Testing testing one\marnote{one (1)} two three four five six seven
eight\marnote{eight (8)} nine\marnote*{nine (9)} ten eleven twelve
thirteen\marnote*{thirteen (13)} fourteen fifteen sixteen seventeen
eighteen\marnote{eighteen (18)} nineteen twenty. \blindtext[1]
\end{document}
答案2
我认为你可以只使用一个 \marginpar,而不是多个来解决这个问题。只需用逗号分隔每个关键字即可。