TeX 可以排版正文两行之间的注释文字吗?

TeX 可以排版正文两行之间的注释文字吗?

如何排版注释文本

There is body blahblah blahblah I need a note here and then blah blah
                                                  The note about word
blahblah blahblah blahblah blahblah blahblah blahblah blahblah blah
where the note is inserted in, and it could be break
blahblah blahblah blahblah blahblah blahblah blahblah blahblah blah     

请参阅下图了解更多详情。 在此处输入图片描述

答案1

我确信最终答案将会使用tikzmarks;-)

不管怎样,这里有一个基于对一些盒子进行混洗的简单的纯 TeX 解决方案。

编辑:现在已启用分页符。

\documentclass{article}

\usepackage{color}

\newdimen\charwd
\charwd=1pt

\makeatletter
\newbox\@tempboxb
\newbox\@tempboxc
\newbox\@tempboxd
\newskip\@tempskipc

\newcommand\textwithnotes[1]
{%
  \setbox\@tempboxb=\hbox{}%
  \setbox\@tempboxa=\hbox\bgroup#1\egroup
  \setbox\@tempboxa=
  \vbox
  {%
    \hsize\linewidth
    \unhbox\@tempboxa
  }%
  \setbox\@tempboxb=
  \vbox
  {%
    \hsize\linewidth
    \unhbox\@tempboxb
  }%
  \setbox\@tempboxa=
  \vbox
  {%
    \offinterlineskip
    \unvbox\@tempboxa
    \mixlines
  }%
  \unvbox\@tempboxa
}

\newcommand\mixlines
{%
  \setbox\@tempboxa=\lastbox
  \ifvoid\@tempboxa
   \else
    \@tempskipa=\lastskip
    \unskip
    \unpenalty
    \global\setbox\@tempboxb=
    \vbox
    {%
      \unvbox\@tempboxb
      \global\setbox\@tempboxc=\lastbox
      \unskip
      \unpenalty
    }%
    \setbox\@tempboxd=\box\@tempboxc
    \begingroup
      \mixlines
    \endgroup
    \vskip\@tempskipa
    \vbox
    {%
      \offinterlineskip
      {\set@color\box\@tempboxa}%
      \vskip4\p@
      \box\@tempboxd
    }%
  \fi
}

\newcommand\note[2]
{%
  \egroup
  \@tempdimb\wd\@tempboxb
  \setbox\@tempboxb=%
  \hbox
  {%
    \unhbox\@tempboxb\fillskip{\dimexpr\wd\@tempboxa-\@tempdimb\relax}%
    \textcolor{red}{#2}%
  }%
  \setbox\@tempboxa=\hbox\bgroup\unhbox\@tempboxa#1%
}

\newcommand\fillskip[1]
{%
  \@tempdima#1%
  \loop
   \ifdim\@tempdima>\z@
    \vrule width \charwd height\z@\hskip\z@
    \advance\@tempdima-\charwd\relax
  \repeat
}



\begin{document}

\raggedright

\textwithnotes{foo foo \note{bar}{baz baz baz} foofoo foo
  \note{bar}{baz baz baz} foofoo foo \note{bar}{baz} foofoo foo
  \note{bar}{baz baz baz} foofoo foo \note{bar}{baz baz baz baz}
  foofoo foo  foofoo foo \note{bar}{baz baz baz} foofoo foo
  \note{bar}{baz} foofoo foo \note{bar}{baz baz baz} foofoo foo
  \note{bar}{baz} foofoo foo \note{bar}{baz baz baz} foofoo foo
  \note{bar}{baz} foofoo foo \note{bar}{baz baz baz} foo} 

\vspace*{15cm}

\textwithnotes{foo foo \note{bar}{baz baz baz} foofoo foo
  \note{bar}{baz baz baz} foofoo foo \note{bar}{baz} foofoo foo
  \note{bar}{baz baz baz} foofoo foo \note{bar}{baz baz baz baz}
  foofoo foo  foofoo foo \note{bar}{baz baz baz} foofoo foo
  \note{bar}{baz} foofoo foo \note{bar}{baz baz baz} foofoo foo
  \note{bar}{baz} foofoo foo \note{bar}{baz baz baz} foofoo foo
  \note{bar}{baz} foofoo foo \note{bar}{baz baz baz} foo} 

\end{document}

会给

示例输出

请注意,这主要是对“TeX 能做到这一点吗?”这个问题的回答。

因此,在真正应用之前可能需要进行一些调整。

不必担心第二行略微的水平错位。对于字符宽度和换行符完全固定的中文文本,不会发生这种情况。

那里,\charwd应该设置为一个字符的宽度。

答案2

如果您只想在文本行间书写,您可能需要使用\raisebox和的组合\rlap。基本上将参数排版在一个框中,该框由其给定的参数升高或降低基线。但是,您希望 TeX 使框的宽度和高度几乎为零。这分别使用和 参数来\raisebox完成。查看文档\rlap\raisebox这里还有例如,这里

现在从您标记的点和注释中画线是另一回事,我尝试使用 TeX \rule,但也许 tikz 可以提供更好的帮助。

\documentclass{article}
\usepackage{color}

%%% Writes a simple small note above the point of use
\def\note#1{\rlap{\raisebox{.5\baselineskip}[0pt][0pt]{{\footnotesize\color{red}#1}}}}

%%% An attempt to also draw a rectangular line from the anchor to the note
\def\linenote#1{{\color{red}\rlap{\rule{0.5pt}{0.75\baselineskip}\rule[0.75\baselineskip]{5pt}{.5pt}\raisebox{.5\baselineskip}[0pt][0pt]{{\footnotesize #1}}}}}    

\begin{document}

Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. 
Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem\note{Some note.} ipsum. 
Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem ipsum. Lorem 
ipsum. Lorem ipsum. Lorem ipsum.\linenote{A note with an anchor line.} 
Lorem ipsum. 
\end{document}

产生以下代码片段: 在此处输入图片描述

为了解释该\note命令,它基本上将其参数写入一个由 一半升高的框中\baselineskip,即正文行之间的间距,指示 TeX 将其视为框锚点上方高度为零,框锚点下方高度为零( 的参数\raisebox),以及宽度为零( 的使用\rlap)。后者还将注释输出到锚点的右侧。如果要使用其他对齐方式,请选中\clap\llap。到目前为止,位置、文本大小和颜色均由标准方式控制。

最后,你可能想看看这个包待办事项。它实现的功能与您需要的功能非常相似,只不过将注释放入边缘,而不是放在行间。

相关内容