边注自动连接

边注自动连接

我试图用它\marginpar来注释文本中出现数据的行。这意味着,我希望它们在精确的声明它们的行,行中通常会有多个,而且我事先不知道有多少个(当我修改文本或更改布局时可能会更改)。问题是,当\marginpar使用多个时,它们会被垂直向下推。理想情况下,我希望连接(中间有空格和/或逗号)。我查看了marginnotemarginfix包,但它们没有做我想要的事情(但是,很可能我没有找到正确的配置参数)。这感觉像是以前可能已经解决的问题,但我找不到它,所以请给我指出正确的方向。

我要这个:

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环境中的 等。

相关内容