我需要创建大量文档,但有一个非常特殊的需求我找不到解决方案。
在这些文件中,有一些带下划线的文字,必须用数字或字母标记,并放在下划线正下方的文字中间。
为了对短文本执行此操作,我使用\underset
数学模式和程序包\ul
中的命令soul
来执行我需要的操作。这仅在项目很短且没有超过换行符时才有效。
我知道该\ul
命令本身可以很好地处理换行符,但我想不出如何让这个居中标签跨多行工作。我需要标签出现在下划线部分的每一行文本中心下方。
例如,如果我有一句标有“4”的带下划线的句子,它在纸上占三行,那么在页面上的每一行的下划线部分下面都必须出现数字“4”。具体来说,如果下划线部分只有一小段,比如一个单词,出现在其中一行,那么标签必须位于该下划线部分下方的中央,而不是位于出现该下划线的整行的中央。
我知道这是一个复杂的要求,但我希望你们中一位聪明的人能为我提供一个解决方案,让我在乳胶中做到这一点(或者如果只有一种方法可以在上下文中做到这一点)。
任何建议都值得赞赏。
\documentclass[two column]{article}
\usepackage{amsmath,soul}
\begin{document}
$\underset{4}{\text{\ul{This is short text}}}$
$\underset{5}{\text{\ul{Much longer text in this format will not split properly along lines, which is the effect I would like to produce.}}}$
\ul{But if I only use the ul command, I will not get the propery labelling on each line like I want}.
\bigskip
$\underset{6}{\text{\ul{I want something to look like this text does, but I}}}$ \\
$\underset{6}{\text{\ul{don't want to manually break lines.}}}$ More text here.
\end{document}
答案1
我刚刚发布了soulpos
,它允许使用基于 savepos 的不同方法(需要 pdftex 或兼容)。需要两次传递:
\documentclass[two column]{article}
\usepackage{amsmath,soul}
\usepackage{soulpos}
\ulposdef{\ulnumaux}{%
$\underset{\saveulnum}{\rule[-.7ex]{\ulwidth}{.4pt}}$}
\newcommand{\ulnum}[2]{%
\def\saveulnum{#1}%
\ulnumaux{#2}}
\begin{document}
\ulnum{4}{This is short text}
\ulnum{6}{I want something to look like this text does, but I
don't want to manually break lines.} More. \ulnum{7}{And more text here.}
\end{document}
答案2
虽然远非完美,但这是一个开始。如果开始和结束在同一行,此版本将不起作用,如果它们之间发生分页符,则此版本将不起作用。这两个问题都可以修复。
前几天我看过这个,但不记得测量线上某个点的位置的技巧,后来巧合的是@FrankMittelbach 出现了,并在这里对它进行了完整的说明
下面是相同的代码,稍微重新排列了一下,就生成了上面的图像(此版本为纯 TeX)
\hsize=.5\hsize
\newdimen\lastlinewidth
\baselineskip1.5\baselineskip
\def\ustart{%
\ustartend{%
\hbox to \hsize{\hskip\lastlinewidth
\leaders\hrule height 0pt depth 1pt\hskip 0pt plus 2fill
\kern-\hsize
\hskip\lastlinewidth\hfill\smash{\raise-7pt\hbox{\tempn}}\hfill
}}}
\def\uend{%
\ustartend{%
\count0=\prevgraf
\unskip\hbox to \hsize{%
\smash{\raise-\baselineskip\vbox{%
\loop
\ifnum\count0>2
\advance\count0 -1
\hbox to \hsize{%
\leaders\hrule height 0pt depth 1pt\hskip 0pt plus 2fill
\kern-\hsize
\hfill\smash{\raise-7pt\hbox{\tempn}}\hfill
}%
\repeat
\hbox to \lastlinewidth{%
\leaders\hrule height 0pt depth 1pt\hskip 0pt plus 2fill
\kern-\lastlinewidth
\hfill\smash{\raise-7pt\hbox{\tempn}}\hfill
}\hfill}}}}}
\def\ustartend#1#2{%
\def\tempn{#2}%
\leavevmode\hbox{}%
\begingroup
\predisplaypenalty=10000
\postdisplaypenalty=10000
\abovedisplayskip=-\baselineskip
\abovedisplayshortskip=-\baselineskip
\belowdisplayskip=0pt %-\baselineskip
\belowdisplayshortskip=0pt %-\baselineskip
$$
\global\lastlinewidth\predisplaysize
\global\advance\lastlinewidth by -2em
#1%
$$%
\endgroup
\vskip-\baselineskip
\vskip-\parskip
\noindent\kern\lastlinewidth
}
\def\n{One two thr\-ee four five six seven eight nine ten. }
\def\c{Red blue yellow green. }
\n\c\ustart{3}start underline \n\n
\n\n\n\n
\n\n end underline\uend{3} first text after end
\n\n
\n\n\n\n\c\ustart{4}start again\c\n\n\c\c\n
\n\n\n end underline\uend{4} first text after end
\n\c\c\n\n\c\c\n
\n\n\n\n\c\c\n\n\c\c\n
\bye