我试图用它\marginpar
来注释文本中出现数据的行。这意味着,我希望它们在精确的声明它们的行,行中通常会有多个,而且我事先不知道有多少个(当我修改文本或更改布局时可能会更改)。问题是,当\marginpar
使用多个时,它们会被垂直向下推。理想情况下,我希望连接(中间有空格和/或逗号)。我查看了marginnote
和marginfix
包,但它们没有做我想要的事情(但是,很可能我没有找到正确的配置参数)。这感觉像是以前可能已经解决的问题,但我找不到它,所以请给我指出正确的方向。
我要这个:
A pendulum of length $5\,\rm cm$\marginpar{$l$} and mass $10\,\rm g$\marginpar{$m$}
is displaced by $6^\circ$\marginpar{$\phi$} and released.
Calculate the momentum in the equilibrium position.
如果中间出现换行符,则在第一行边距中显示“l,m”,在第二行边距中显示“φ”,但如果没有换行符(取决于布局),则在第一行边距中显示“l,m,φ”。
不要关注其余的标记,它只是为了说明要点而编写的存根。
答案1
请始终发布完整的文档,而不仅仅是片段,如果以默认article
文本宽度使用片段,则会将所有三个注释放在同一行。因此,我不得不尝试不同的宽度以获得所需的效果:
\documentclass{article}
\newcounter{xmarginpar}
\newlength\xmarginparshift
\setlength\textwidth{8cm}
\makeatletter
\def\xmarginpar#1{%
\stepcounter{xmarginpar}%
\strut\pdfsavepos
\protected@write\@auxout{}{%
\global\string\@namedef{pos@\thexmarginpar}{\thepage/\noexpand\the\pdflastypos}%
}%
% if defined
\expandafter\ifx\csname pos@\thexmarginpar\endcsname\relax\else
% if on same line as previous
\expandafter\ifx\csname pos@\thexmarginpar\expandafter\endcsname
\csname pos@\the\numexpr\thexmarginpar-1\relax\endcsname
\setbox0\hbox{\kern\xmarginparshift,#1}%
\else
\setbox0\hbox{\kern\textwidth\,#1}%
\fi
\global\xmarginparshift\wd\z@
\vadjust{\kern-\dp\strutbox\hbox{\smash{\box0}}\kern\dp\strutbox}%
\fi
\relax}
\begin{document}
A pendulum of length $5\,\mathrm{cm}$\xmarginpar{$l$} and
mass $10\,\mathrm{g}$\xmarginpar{$m$}
is displaced by $6^\circ$\xmarginpar{$\phi$} and released.
Calculate the momentum in the equilibrium position.
\end{document}
答案2
根据 David 的想法,我编写了一个版本,使用\marginpar
它的优点在于:1. 注释总是在文本的右侧,并且边距部分的设置(\marginparsep
和\marginparwidth
)也适用于此处。
与 David 的实现相比,主要的区别在于我检查了另一条注释关注(大卫检查前并且,仅当此行中没有其他注释(或根本没有,即在文档末尾)时,才会将先前收集的注释合并为一个 进行打印\marginpar
。
\documentclass{scrbook}
\usepackage{geometry}
\geometry{paper=a5paper,textwidth=8cm,showframe}
\usepackage{xparse}
\ExplSyntaxOn\makeatletter
\cs_generate_variant:Nn \cs_if_eq:NNTF { ccTF }
% Variables
%% Counter for itentifiying mpars
\newcounter { combinedmpars }
%% Sequence for storing the mpars to be combined
\seq_new:N \g_tobi_mpars_seq
% User level macro to set the margin par
\NewDocumentCommand { \mpar } { m } {
% increment counter
\stepcounter { combinedmpars }
% save current absolute position on page
\strut \pdfsavepos
% write position of this note to aux file
\protected@write \@auxout { } {
\global \string \@namedef
{ tobi_mpar_pos_ \number \value { combinedmpars } }
{ \thepage / \noexpand\the\pdflastypos }
}
% append current ref to list of refs
\seq_gput_right:Nn \g_tobi_mpars_seq { #1 }
% check if a _next_ mpar position is defined
\cs_if_exist:cTF { tobi_mpar_pos_ \int_eval:n { \value { combinedmpars } + 1 } } {
% if TRUE
% check if it has the same position
\cs_if_eq:ccF
{ tobi_mpar_pos_ \number \value { combinedmpars } }
{ tobi_mpar_pos_ \int_eval:n { \value { combinedmpars } + 1 } }
{
% if FALSE
% ship out complete margin par
\tobi_print_mpars:
}
} {
% if FALSE
% ship out complete margin par
\tobi_print_mpars:
}
}
% internal macro to print all marginpars of a line
\cs_new:Nn \tobi_print_mpars: {
\marginline {
\seq_map_function:NN \g_tobi_mpars_seq \tobi_format_mpar:n
}
\seq_gclear:N \g_tobi_mpars_seq
}
% internal macro to format a marginpar (cross reference in my case)
\cs_new:Nn \tobi_format_mpar:n {
$\to$ ~ #1
\quad
}
\ExplSyntaxOff\makeatother
\begin{document}
odd page\clearpage
A pendulum of length $5\,\mathrm{cm}$\mpar{$l$} and
mass $10\,\mathrm{g}$\mpar{$m$}
is displaced by $6^\circ$\mpar{$\phi$} and released.
Calculate the momentum in the equilibrium position.
\clearpage
A pendulum of length $5\,\mathrm{cm}$\mpar{$l$} and
mass $10\,\mathrm{g}$\mpar{$m$}
is displaced by $6^\circ$\mpar{$\phi$} and released.
Calculate the momentum in the equilibrium position.
\end{document}
编辑/修复(2017/06/29):的增加\g_tobi_mpar_int
必须在全球范围内进行。
编辑/修复(2017/06/30):从 L3 计数器更改int
为 L2 计数器。这样做的好处是计数器值存储在辅助文件中,并且解决方案适用于多个\includes
,而 L3 版本则需要在每个章节结束时手动保存值。由于\stepcounter
始终是全局的,因此无需特别关注\mpar
环境中的 等。