我需要排版一个句子,这样只有单词下划线,而不是单词之间的空格。使用 将\underline
包括单词之间的空格。我可以用类似这样的方法来实现
\underline{The} \underline{quick} \underline{brown} \underline{fox} \underline{jumped} \underline{over} \underline{the} \underline{lazy} \underline{dog}
但这太繁琐,做起来很痛苦。此外,上面的一行产生了预期的结果,但下划线与单词的间距不均匀。如果在答案中也解决这个问题,那将非常有帮助。上面的一行产生了这样的结果:
是否有一个软件包或者其他更简单的工具可以实现这一点?
答案1
让我们soul
减少工作量:
\documentclass{article}
\usepackage{xparse,soul}
\ExplSyntaxOn
\NewDocumentCommand{\ulns}{m}
{
\seq_set_split:Nnn \l_tmpa_seq { ~ } { #1 }
\seq_map_inline:Nn \l_tmpa_seq { \ul{##1}~ } \unskip
}
\ExplSyntaxOff
\begin{document}
\ulns{The quick brown fox jumped} over the lazy dog.
\end{document}
基本上,参数在空格处被拆分;每个片段都被输入\ul
并添加一个空格。最后一个被删除\unskip
。
答案2
软件包soul
提供了具有相同深度的下划线宏\textul
/ \ul
。以下示例将驱动程序复制到\textulw
/\ulw
并且不保留空格下划线:
\documentclass{article}
\usepackage{soul}
\makeatletter
\DeclareRobustCommand*{\textulw}{%
\SOUL@ulwsetup
\SOUL@
}
\newcommand*{\SOUL@ulwsetup}{%
\SOUL@setup
\let\SOUL@preamble\SOUL@ulpreamble
\let\SOUL@everysyllable\SOUL@uleverysyllable
% \let\SOUL@everyspace\SOUL@uleveryspace % \SOUL@ulsetup
\let\SOUL@everyhyphen\SOUL@uleveryhyphen
\let\SOUL@everyexhyphen\SOUL@uleveryexhyphen
}
\let\ulw\textulw
\makeatother
\begin{document}
\ulw{The quick brown fox jumped over the lazy dog}.
\end{document}
答案3
这是一个基于 LuaLaTeX 的解决方案。它不需要加载包soul
。
用户宏称为\ulow
-- “仅下划线单词”的缩写。使用\ulow
,所有非字母字形(而不仅仅是空格)都无需加下划线。
假定输入是 UTF8 编码的。(ASCII 是 UTF8 的真子集;因此,如果您的输入文件是纯 ASCII,则它自动为 UTF8。)
如果 的参数\ulow
包含带降部的字母(g、j、p、q 或 y),则所有单词下方的行将设置大量垂直空格。相反,如果没有带降部的字母,间距将设置得更紧密。如果您想在所有情况下都获得更大的间距,只需将if
lua 函数中的五行构造替换为s = unicode.utf8.gsub (s, "(%a+)" , "\\underline{%1\\vphantom{p}}" )
。(即使您不了解 Lua 语法,您也可能猜到术语%a+
“捕获”整个单词,其中“单词”可以是任何连续的大写和小写字母组。)
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{fontspec}
\setmainfont{Latin Modern Roman} % set main document font
%% Lua-side code
\usepackage{luacode}
\begin{luacode}
function ulow ( s )
if unicode.utf8.find ( s, "[gjpqy]") then -- any letters with descenders?
s = unicode.utf8.gsub (s, "(%a+)" , "\\underline{%1\\vphantom{p}}" )
else
s = unicode.utf8.gsub (s, "(%a+)" , "\\underline{%1}" )
end
return ( tex.sprint ( s ) )
end
\end{luacode}
%% TeX-side code
\newcommand\ulow[1]{\directlua{ ulow ( \luastring {#1} ) }}
\begin{document}
\frenchspacing
\ulow{The quick brown fox jumps over the lazy dog.}
\bigskip
\ulow{El rápido zorro marrón saltó sobre el perro perezoso.}
\bigskip
\ulow{And, but; let: show? that. where (now), èéà äöü ÄÖÜß!}
\end{document}
答案4
另一个“简单”的宏,没有包,通过空格来切分,然后在每个单词中使用包\ul
:soul
\def\UL#1{\expandafter\nusp#1 \nil}
\def\nusp#1 #2\nil{\ul{#1} \ifx\relax#2\relax\else\nusp#2\nil\fi}
据我所知,\UL{}
在换行符(带或不带降部)和其他一些情况下也能很好地工作(参见 MWE 代码)。\xspace
当参数后面跟着标点符号(即 )时,MWE 中的空格被更改为 s,以避免出现结尾空格\UL{Some text}.
。
\documentclass[a5paper,11pt]{article}
\parskip1em\parindent0em
\usepackage{soul,xspace,xcolor}
\def\UL#1{\expandafter\nusp#1 \nil}
\def\nusp#1 #2\nil{\ul{#1}\xspace\ifx\relax#2\relax\else\nusp#2\nil\fi}
\begin{document}
% Simple test
\UL{The quick brown fox} jumped over the lazy dog.\par
% Testing line breaks
\UL{The quick brown fox jumped over the lazy dog.
The quick brown fox jumped over the lazy dog.
The quick brown fox jumped over the lazy dog.}
% Testing underline grouped words
\UL{The {quick brown fox} jumped over \mbox{the lazy dog}.}\par
% Testing if \xspace work
\UL{The quick brown fox jumped over the lazy dog}.\par
% Testing the rule depth with/without descenders
The quick \UL{brown fox} jumped over the \UL{lazy dog}.\par
% Testing \UL nested in other formating commands
The \textbf{\UL{quick brown fox}} jumped over the {\em \UL{lazy dog}}.\par
% Testing commands inside \UL. Needed some grouping/boxing ...
\UL{The
\mbox{\fboxrule.5pt\fboxsep.5pt%
\fcolorbox{orange!20!yellow}{yellow!60}{quick brown fox}}
jumped over the lazy dog}\par
\UL{The {\textsc{quick brown fox}} jumped over the lazy dog}\par
\end{document}