
Я прекрасно понимаю, что это считается лучшей практикой.нетиспользовать подчеркивание не только на пишущих машинках и в рукописном тексте. Но иногда это все же необходимо.
По моему мнению, наименее оскорбительный с точки зрения типографики способ подчеркивания в печати — это опустить нижние выносные элементы. Именно так я научился делать это в рукописном тексте. Очень немногие шрифты предлагают готовый подчеркнутый вариант, но некоторые текстовые процессоры (например, текстовый движок OS X) делают — в зависимости от используемого шрифта — приемлемую работу по эмуляции этого эффекта:
Как бы мне настроить любой из существующих способов/пакетов подчеркивания, чтобы сделать то же самое?
В качестве бонуса я хотел бы иметь возможность настраивать поведение (степень пропущенной части, применять к определенным буквам) для каждого шрифта и стиля текста, желательно работая с XeLaTeX.
решение1
Мы могли бы сделать для каждой буквы:
- Произвести подчеркивание
- Заменить строку той же, но более жирной буквой или смещенной влево и вправо, но на фоне или белом цвете.
- Напиши письмо
Таким образом, мы получим подчеркивание с соответствующими пробелами.
Здесь я модифицировал soul
подход Марко следующим образом, просто для демонстрации того, что я имею в виду, и что можно улучшить (смелость, цикл):
\setcounter{errorcontextlines}{999}
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\usepackage{soul}
\usepackage{color}
\makeatletter
\newcommand*{\whiten}[1]{\llap{\textcolor{white}{{\the\SOUL@token}}\hspace{#1pt}}}
\DeclareRobustCommand*\myul{%
\def\SOUL@everyspace{\underline{\space}\kern\z@}%
\def\SOUL@everytoken{%
\setbox0=\hbox{\the\SOUL@token}%
\ifdim\dp0>\z@
\raisebox{\dp0}{\underline{\phantom{\the\SOUL@token}}}%
\whiten{1}\whiten{0}%
\whiten{-1}\whiten{-2}%
\llap{\the\SOUL@token}%
\else
\underline{\the\SOUL@token}%
\fi}%
\SOUL@}
\makeatother
\begin{document}
\sffamily\Huge
\myul{jumping quickly}
\end{document}
решение2
Вот решение с использованием пакетов contour
и ulem
.
На мой взгляд, это создает очень красивое подчеркивание, особенно для подчеркивания заголовков:
\documentclass{article}
\usepackage[outline]{contour}
\usepackage{ulem}
\normalem % use classical emph
\newcommand \myul[4]{%
\begingroup%
\renewcommand \ULdepth {#1}%
\renewcommand \ULthickness {#2}%
\contourlength{#3}%
\uline{\phantom{#4}}\llap{\contour{white}{#4}}%
\endgroup%
}
\newcommand \myulline[4]{%
\begingroup%
\renewcommand \ULdepth {#1}%
\renewcommand \ULthickness {#2}%
\contourlength{#3}%
\noindent\rlap{\uline{\hspace{\textwidth}}}\contour{white}{#4}%
\endgroup%
}
\begin{document}
\bfseries
\Huge
\myulline{5pt}{1pt}{2pt}{Chapter Eight}
\vspace{1cm}
\normalsize
\normalfont
Test. \myul{2pt}{0.5pt}{1pt}{Quit jumping quickly!} Test.
Test. \myul{1.2pt}{0.5pt}{0.5pt}{Quit jumping quickly!} Test.
\end{document}
Выход:
Крупным планом:
Недостатком является то, что глубина подчеркивания не может быть очень близка к базовой линии, поскольку она может быть скрыта контуром.
решение3
Просто потому, что я нашел это полезным, вот модификация ответа Стефана выше, которая позволяет вам контролировать глубину, толщину и ширину подчеркивания. Это может быть полезно, например, с более крупным или жирным шрифтом. Синтаксис: \varul<width>[depth][thickness]{stuff}
где:
<width>
необязательно и задано как кратное1/100 em
, например,<10>
даст ширину зазора0.1em
. Значение по умолчанию:5
[depth]
необязательно и задается как положительное значение (включая единицы), которое указывает расстояние ниже базовой линии для рисования подчеркивания. Значение по умолчанию —0.2ex
.[thickness]
необязательно и задается как положительное значение (включая единицы), определяющее толщину подчеркивания. Значение по умолчанию:0.1ex
- Четвертый, обязательный аргумент — это то, что вы хотите подчеркнуть.
Это будет работать для абзацев и переносов строк, но может немного изменить интервал.
\documentclass{article}
\usepackage{soul}
\usepackage{xcolor}
\usepackage{xparse}
\makeatletter
\ExplSyntaxOn
\cs_new:Npn \white_text:n #1
{
\fp_set:Nn \l_tmpa_fp {#1 * .01}
\llap{\textcolor{white}{\the\SOUL@syllable}\hspace{\fp_to_decimal:N \l_tmpa_fp em}}
\llap{\textcolor{white}{\the\SOUL@syllable}\hspace{-\fp_to_decimal:N \l_tmpa_fp em}}
}
\NewDocumentCommand{\whiten}{ m }
{
\int_step_function:nnnN {1}{1}{#1} \white_text:n
}
\ExplSyntaxOff
\NewDocumentCommand{ \varul }{ D<>{5} O{0.2ex} O{0.1ex} +m } {%
\begingroup
\setul{#2}{#3}%
\def\SOUL@uleverysyllable{%
\setbox0=\hbox{\the\SOUL@syllable}%
\ifdim\dp0>\z@
\SOUL@ulunderline{\phantom{\the\SOUL@syllable}}%
\whiten{#1}%
\llap{%
\the\SOUL@syllable
\SOUL@setkern\SOUL@charkern
}%
\else
\SOUL@ulunderline{%
\the\SOUL@syllable
\SOUL@setkern\SOUL@charkern
}%
\fi}%
\ul{#4}%
\endgroup
}
\makeatother
\begin{document}
\varul{\Huge jumping quickly}\par\smallskip
\varul[1pt][1pt]{\Huge jumping quickly}
\end{document}
Редактировал Тоби: \fp_mul:Nn
не работает в текущей версии TeXlive, поэтому я заменил две строки просто на \fp_set:Nn \l_tmpa_fp {#1 * .01}
.
решение4
Я использую следующую адаптацию ответа CDSousa по двум причинам: во-первых, XCharter + contour по какой-то причине выглядит более грубо, чем остальной текст; во-вторых, чтобы обеспечить тесное подчеркивание (недостаток, на который указал CDSousa):
\usepackage{ulem}
\normalem % use classical emph
\usepackage{color}
\usepackage{pgffor}
\newcommand\myul[4]{% arg 1: underline depth; arg 2: underline thickness; arg 3: space around descenders in pt (!)
\begingroup%
\renewcommand\ULdepth{#1}%
\renewcommand\ULthickness{#2}%
\uline{\phantom{\smash{#4}}}%
\foreach \hshift in {0.0, 0.1, ..., #3}{%
\foreach \upshift in {-0.4, -0.3, ..., 1.0}{%
\llap{\color{white}\raisebox{\upshift0pt}[0pt]{#4}\hspace{\hshift0pt}}%
\llap{\color{white}\raisebox{\upshift0pt}[0pt]{#4}\hspace{-\hshift0pt}}%
}%
}%
\llap{#4}%
\endgroup%
Пример: \myul{1.75pt}{.5pt}{2}{Blupp of (that's \emph{of}, not \emph{off}, of course) a great Synopsis}
имеет глубину подчеркивания 1.75pt
, толщину подчеркивания .5pt
и интервал 2pt
и выглядит как