只在单词下划线,而不在单词之间的空格下划线

只在单词下划线,而不在单词之间的空格下划线

我需要排版一个句子,这样只有单词下划线,而不是单词之间的空格。使用 将\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),则所有单词下方的行将设置大量垂直空格。相反,如果没有带降部的字母,间距将设置得更紧密。如果您想在所有情况下都获得更大的间距,只需将iflua 函数中的五行构造替换为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

另一个“简单”的宏,没有包,通过空格来切分,然后在每个单词中使用包\ulsoul

\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}

相关内容