Смешивание подчеркивания и зачеркивания

Смешивание подчеркивания и зачеркивания

Word допускает все виды форматирования шрифтов:

введите описание изображения здесь

В приведенном выше примере сочетаются зачеркивание/вычеркивание (вот так ) и подчеркивание. Я бы хотел иметь возможность делать то же самое, но ни то, ни другоеulemниsoulпозволяет сделать это удобным способом.

  • ulem:

    введите описание изображения здесь

    \documentclass{article}
    \usepackage[a6paper,showframe]{geometry}% Just for this example
    \usepackage{ulem}
    \begin{document}
    Lorem ipsum dolor sit amet, \sout{consectetur adipiscing elit. 
    Praesent} in nisi magna. Mauris \sout{auctor gravida} fermentum. 
    Proin enim \uline{massa, \sout{\textbf{lobortis in} ligula} vel, convallis} fermentum 
    nulla. \uline{Nam in mattis nulla}. Vestibulum vel \uline{auctor orci. 
    Praesent \textit{\textbf{ornare, eros} ac} euismod} congue, turpis est facilisis 
    nisi, a sollicitudin massa lectus imperdiet tellus. Duis at 
    tempor velit. \sout{Nulla \uline{gravida}, dolor in cursus}. 
    \end{document}
    
  • soul:

    Thesoulдокументацияпрямо заявляет, что «вложенные soulкоманды не работают»:

    введите описание изображения здесь

    Таким образом, следующий пример не компилируется без ошибок:

    \documentclass{article}
    \usepackage[a6paper,showframe]{geometry}% Just for this example
    \usepackage{soul}
    \begin{document}
    Lorem ipsum dolor sit amet, \st{consectetur adipiscing elit. 
    Praesent} in nisi magna. Mauris \st{auctor gravida} fermentum. 
    Proin enim \ul{massa, \st{\textbf{lobortis in} ligula} vel, convallis} fermentum 
    nulla. \ul{Nam in mattis nulla}. Vestibulum vel \ul{auctor orci. 
    Praesent \textit{\textbf{ornare, eros} ac} euismod} congue, turpis est facilisis 
    nisi, a sollicitudin massa lectus imperdiet tellus. Duis at 
    tempor velit. \st{Nulla \ul{gravida}, dolor in cursus}. 
    \end{document}
    

В идеале я хотел бы иметь возможность использовать эти макросы «эффектов» шрифта взаимозаменяемо: зачеркивание внутри подчеркивания или подчеркивание внутри зачеркивания без влияния на использование шрифтов (например,курсивилисмелый). Вот вывод из Word:

введите описание изображения здесь

(См. также дополнительный вопрос:Подчеркивание + зачеркивание с помощью soul)

решение1

Вот адаптация ответа Мартина наКрутая подсветка текста в LaTeXгде я определил \tikzstна основе Мартина \tikzul.

Это показывает примеры

  • зачеркивание и подчеркивание
  • зачеркивание и выделение

введите описание изображения здесь

Примечание:

  • Обычно \tikzmarkрешения требуют двух запусков. Поскольку есть вложенные использования \tikzmark, это требует втриработает. (Спасибо @Werner за указание на это).

    Дополнительный запуск требуется, поскольку tikzmarkрасположение вложенных зависит от расположения родительских \tikzmark. Таким образом, первый запуск стабилизирует расположение «внешнего» \tikzmark, второй стабилизирует расположение «внутреннего» \tikzmark, а третий выполняет фактическую отрисовку.

  • Это \tikzmarkотДобавление большой скобки рядом с текстом.

Код:

\documentclass[twoside,11pt]{book}

\usepackage{zref-abspage}
\usepackage{zref-user}
\usepackage{tikz}
\usepackage{atbegshi}
\usetikzlibrary{calc,decorations.pathmorphing}

\makeatletter
\newcommand{\currentsidemargin}{%
  \ifodd\zref@extract{textarea-\thetextarea}{abspage}%
    \oddsidemargin%
  \else%
    \evensidemargin%
  \fi%
}

\newcounter{textarea}
\newcommand{\settextarea}{%
   \stepcounter{textarea}%
   \zlabel{textarea-\thetextarea}%
   \begin{tikzpicture}[overlay,remember picture]
    % Helper nodes
    \path (current page.north west) ++(\hoffset, -\voffset)
        node[anchor=north west, shape=rectangle, inner sep=0, minimum width=\paperwidth, minimum height=\paperheight]
        (pagearea) {};
    \path (pagearea.north west) ++(1in+\currentsidemargin,-1in-\topmargin-\headheight-\headsep)
        node[anchor=north west, shape=rectangle, inner sep=0, minimum width=\textwidth, minimum height=\textheight]
        (textarea) {};
  \end{tikzpicture}%
}


\usepackage{lipsum}
\newcommand\xlipsum[1][]{{\let\par\relax\lipsum*[#1]}}

\tikzset{tikzul/.style={yshift=-.75\dp\strutbox}}

\newcounter{tikzul}%
\newcommand\tikzul[1][]{%
    \begingroup
    \global\tikzullinewidth\linewidth
    \def\tikzulsetting{[#1]}%
    \stepcounter{tikzul}%
    \settextarea
    \zlabel{tikzul-begin-\thetikzul}%
    \tikz[overlay,remember picture,tikzul] \coordinate (tikzul-\thetikzul) at (0,0);% Modified \tikzmark macro
    \ifnum\zref@extract{tikzul-begin-\thetikzul}{abspage}=\zref@extract{tikzul-end-\thetikzul}{abspage}
    \else
        \AtBeginShipoutNext{\tikzul@endpage{#1}}%
    \fi
    \bgroup
    \def\par{\ifhmode\unskip\fi\egroup\par\@ifnextchar\noindent{\noindent\tikzul[#1]}{\tikzul[#1]\bgroup}}%
    \aftergroup\endtikzul
    \let\@let@token=%
}
\newlength\tikzullinewidth


\def\tikzul@endpage#1{%
\setbox\AtBeginShipoutBox\hbox{%
\box\AtBeginShipoutBox
\hbox{%
\begin{tikzpicture}[overlay,remember picture,tikzul]
\draw[#1]
    let \p1 = (tikzul-\thetikzul), \p2 = ([xshift=\tikzullinewidth+\@totalleftmargin]textarea.south west) in
    \ifdim\dimexpr\y1-\y2<.5\baselineskip
        (\x1,\y1) -- (\x2,\y1)
    \else
        let \p3 = ([xshift=\@totalleftmargin]textarea.west) in
        (\x1,\y1) -- +(\tikzullinewidth-\x1+\x3,0)
        % (\x3,\y2) -- (\x2,\y2)
        (\x3,\y1)
       \myloop{\y1-\y2+.5\baselineskip}{%
           ++(0,-\baselineskip) -- +(\tikzullinewidth,0)
       }%
    \fi
;
\end{tikzpicture}%
}}%
}%


\def\endtikzul{%
    \zlabel{tikzul-end-\thetikzul}%
    \ifnum\zref@extract{tikzul-begin-\thetikzul}{abspage}=\zref@extract{tikzul-end-\thetikzul}{abspage}
    \begin{tikzpicture}[overlay,remember picture,tikzul]
        \expandafter\draw\tikzulsetting
            let \p1 = (tikzul-\thetikzul), \p2 = (0,0) in
            \ifdim\y1=\y2
                (\x1,\y1) -- (\x2,\y2)
            \else
                let \p3 = ([xshift=\@totalleftmargin]textarea.west), \p4 = ([xshift=-\rightmargin]textarea.east) in
                (\x1,\y1) -- +(\tikzullinewidth-\x1+\x3,0)
                (\x3,\y2) -- (\x2,\y2)
                (\x3,\y1)
                \myloop{\y1-\y2}{%
                    ++(0,-\baselineskip) -- +(\tikzullinewidth,0)
                }%
            \fi
        ;
    \end{tikzpicture}%
    \else
    \settextarea
    \begin{tikzpicture}[overlay,remember picture,tikzul]
        \expandafter\draw\tikzulsetting
            let \p1 = ([xshift=\@totalleftmargin,yshift=-.5\baselineskip]textarea.north west), \p2 = (0,0) in
            \ifdim\dimexpr\y1-\y2<.5\baselineskip
                (\x1,\y2) -- (\x2,\y2)
            \else
                let \p3 = ([xshift=\@totalleftmargin]textarea.west), \p4 = ([xshift=-\rightmargin]textarea.east) in
                (\x3,\y2) -- (\x2,\y2)
                (\x3,\y2)
                \myloop{\y1-\y2}{%
                    ++(0,+\baselineskip) -- +(\tikzullinewidth,0)
                }
            \fi
        ;
    \end{tikzpicture}%
    \fi
    \endgroup
}

% -------------------------------------------------------------- Additions by Peter Grill

\tikzset{tikzst/.style={yshift=0.5\dp\strutbox}}

\newcounter{tikzst}%
\newcommand\tikzst[1][]{%
    \begingroup
    \global\tikzstlinewidth\linewidth
    \def\tikzstsetting{[#1]}%
    \stepcounter{tikzst}%
    \settextarea
    \zlabel{tikzst-begin-\thetikzst}%
    \tikz[overlay,remember picture,tikzst] \coordinate (tikzst-\thetikzst) at (0,0);% Modified \tikzmark macro
    \ifnum\zref@extract{tikzst-begin-\thetikzst}{abspage}=\zref@extract{tikzst-end-\thetikzst}{abspage}
    \else
        \AtBeginShipoutNext{\tikzst@endpage{#1}}%
    \fi
    \bgroup
    \def\par{\ifhmode\unskip\fi\egroup\par\@ifnextchar\noindent{\noindent\tikzst[#1]}{\tikzst[#1]\bgroup}}%
    \aftergroup\endtikzst
    \let\@let@token=%
}
\newlength\tikzstlinewidth


\def\tikzst@endpage#1{%
\setbox\AtBeginShipoutBox\hbox{%
\box\AtBeginShipoutBox
\hbox{%
\begin{tikzpicture}[overlay,remember picture,tikzst]
\draw[#1]
    let \p1 = (tikzst-\thetikzst), \p2 = ([xshift=\tikzstlinewidth+\@totalleftmargin]textarea.south west) in
    \ifdim\dimexpr\y1-\y2<.5\baselineskip
        (\x1,\y1) -- (\x2,\y1)
    \else
        let \p3 = ([xshift=\@totalleftmargin]textarea.west) in
        (\x1,\y1) -- +(\tikzstlinewidth-\x1+\x3,0)
        % (\x3,\y2) -- (\x2,\y2)
        (\x3,\y1)
       \myloop{\y1-\y2+.5\baselineskip}{%
           ++(0,-\baselineskip) -- +(\tikzstlinewidth,0)
       }%
    \fi
;
\end{tikzpicture}%
}}%
}%


\def\endtikzst{%
    \zlabel{tikzst-end-\thetikzst}%
    \ifnum\zref@extract{tikzst-begin-\thetikzst}{abspage}=\zref@extract{tikzst-end-\thetikzst}{abspage}
    \begin{tikzpicture}[overlay,remember picture,tikzst]
        \expandafter\draw\tikzstsetting
            let \p1 = (tikzst-\thetikzst), \p2 = (0,0) in
            \ifdim\y1=\y2
                (\x1,\y1) -- (\x2,\y2)
            \else
                let \p3 = ([xshift=\@totalleftmargin]textarea.west), \p4 = ([xshift=-\rightmargin]textarea.east) in
                (\x1,\y1) -- +(\tikzstlinewidth-\x1+\x3,0)
                (\x3,\y2) -- (\x2,\y2)
                (\x3,\y1)
                \myloop{\y1-\y2}{%
                    ++(0,-\baselineskip) -- +(\tikzstlinewidth,0)
                }%
            \fi
        ;
    \end{tikzpicture}%
    \else
    \settextarea
    \begin{tikzpicture}[overlay,remember picture,tikzst]
        \expandafter\draw\tikzstsetting
            let \p1 = ([xshift=\@totalleftmargin,yshift=-.5\baselineskip]textarea.north west), \p2 = (0,0) in
            \ifdim\dimexpr\y1-\y2<.5\baselineskip
                (\x1,\y2) -- (\x2,\y2)
            \else
                let \p3 = ([xshift=\@totalleftmargin]textarea.west), \p4 = ([xshift=-\rightmargin]textarea.east) in
                (\x3,\y2) -- (\x2,\y2)
                (\x3,\y2)
                \myloop{\y1-\y2}{%
                    ++(0,+\baselineskip) -- +(\tikzstlinewidth,0)
                }
            \fi
        ;
    \end{tikzpicture}%
    \fi
    \endgroup
}
% --------------------------------------------------------------

\def\myloop#1#2#3{%
    #3%
    \ifdim\dimexpr#1>1.1\baselineskip
        #2%
        \expandafter\myloop\expandafter{\the\dimexpr#1-\baselineskip\relax}{#2}%
    \fi
}

\makeatother

\begin{document}

text text text text text text text text text text text
text text text text text text text text text text text
text text text text text text text text text text text
text text \tikzul[red]{text text text text \tikzst[black, ultra thick]{text text text text text
text text text text text text text text} text text text
text text text text} text text text text text text text
text text text text text text text text text text text
text text text text text text text text text text text

{\tikzset{tikzul/.style={yshift=1ex}}

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit,
vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida
mauris. Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna.
Donec vehicula augue eu neque. Pellentesque habitant morbi tristique senectus
et netus et malesuada fames ac turpis egestas. Mauris ut leo. Cras viverra
metus rhoncus sem. Nulla et lectus vestibulum urna fringilla ultrices. Phasellus
eu tellus sit amet tortor gravida placerat. Integer sapien est, iaculis in, pretium
quis, viverra ac, nunc. Praesent eget sem vel leo ultrices bibendum. \tikzul[line width=1.5\ht\strutbox,semitransparent,yellow]{Aenean
faucibus. Morbi dolor nulla, \tikzst[black, ultra thick]{malesuada eu, pulvinar at, mollis ac, nulla. Curabitur auctor semper nulla. Donec varius orci eget risus. Duis nibh mi, congue
eu, accumsan eleifend, sagittis quis}, diam. Duis eget orci sit amet orci dignissim
rutrum.}
text text text text text text text text text text text
text text text text text text text text text text text
text text text text text text text text text text text
test
}

\begin{quote}
text text text text text text text text text text text
text text text text text text text text text text text
text text text text text text text text text text text
text text \tikzul[red]{text text text \tikzst[black, ultra thick]{text text text text text text
text text text text text text text text text text text
text text text text text text text} text text text text
text text text text text text text text text text text
text text text text text text text text text text text
text text text text} text text text text text text text
text text text text text text text text text text text
text text text text text text text text text text text
\end{quote}

{\tikzset{tikzul/.style={yshift=.5ex}}

\begin{quote}
text text text text text text text text text text text
text text text text text text text text text text text
\begin{quote}
text text text text text text text text text text text
text text \tikzul[green]{text text \tikzst[black, ultra thick]{text text text text text text text
text text text text text text text text text text text
text text text text 
text text text text text text text}
text text text text text text text text text text text
text text text text text text text text text text text
text text text text} text text text text text text text
\end{quote}
text text text text text text text text text text text
text text text text text text text text text text text
\end{quote}

\large
new text text text text text text text text text text text
text text \tikzul[red]{first text text text text \tikzst[black, ultra thick]{text text text text
teXt teXt teXt teXt teXt teXt teXt teXt teXt teXt teXt
teXt teXt teXt} teXt teXt teXt teXt teXt teXt teXt teXt
teXt teXt teXt last} teXt teXt teXt teXt teXt teXt teXt
text text text text text text text text text text text
text text text text text text text text text text text

text text text text text text text text text text text
text text text text text text text text text text text
text text \tikzul[red]{text text text text text text text text text
text text\par\noindent text text text text text text text text text
text text text text} text text text text text text text
text text text text text text text text text text text
text text text text text text text text text text text
}

\begin{itemize}
    \item \tikzul{test test test} test
    \item test \tikzul{test test test} test
    \item aa \tikzul{test test test} test
    \item b \tikzul{test test 
text text text text text text text text text text text
text text text text text text text text text text text
text text text text text text text text text text text
        test} test
\end{itemize}

text text text text text text text text text text text
text text text text text text text text text text text
text text text text text text text text text text text
text text text text text text text text text text text
text text \tikzul[red]{text text text text text text text text text
text text

 text text text text text text text text text
text text text text} text text text text text text text
text text text text text text text text text text text
text text text text text text text text text text text

text text text text text text text text text text text
text text text text text text text text text text text
text text \tikzul[red]{text text text text text text text text text
text text

\noindent text text text text text text text text text
\par text text text text} text text text text text text text
text text text text text text text text text text text
text text text text text text text text text text text


\end{document}

решение2

Существует несколько вариантов — все из них поддерживают перенос строки:

  • lua-ul:https://tex.stackexchange.com/a/533377/250119(специально для выделения+подчеркивания, самое простое решение, работает по умолчанию)
  • индивидуальный ответ с использованием tikz:https://tex.stackexchange.com/a/176118/250119(допускает произвольную вложенностьно требует ≥ 3 компиляций, если вложенные)
  • soulpos: см. мой ответ наhttps://tex.stackexchange.com/a/685471/250119(специально для выделения+зачеркивания) — необходимо знать программирование TeX, чтобы определить команды, и для этого требуются 2 компиляции.
  • soul:https://tex.stackexchange.com/a/178701/250119(специально для зачеркивания+подчеркивания) — этот пакет по своей сути использует \leaders, поэтому ответ работает путем повторения полей шириной 0,1 пт, что приводит к тяжелому PDF-файлу.

Эти решенияне поддерживает перенос строки:

Для завершения ниже приведено решение, использующее ulemвместо этого (адаптировано измой ответ определяющий\dwave) -- ulemне имеет ограничения «равномерной горизонтальности», ноне поддерживает переносыили:

%! TEX program = lualatex
\documentclass{article}
\usepackage{ulem}

\makeatletter
\protected\def\ulinesout{%
    \leavevmode \bgroup
    \UL@setULdepth
    \markoverwith {%
        \rlap{\rule[.55ex]{2pt}{0.4pt}}%
        \rule[-\ULdepth]{2pt}{0.4pt}%  \rule[-.673ex]{2pt}{0.4pt}
    }%
    \ULon 
}
\makeatother
\begin{document}

\uline{a}\ulinesout{b}\sout{c}

\uline{Producing a colored underline or strike-through is }\ulinesout{not supported by
regular uline}\sout{ or sout, but it is quite easy to colorize using the
markoverwith mechanism}

\end{document}

Как отмечено в ulemдокументации, это не «по-настоящему гибкое» правило, но в данном случае оно кажется невозможным, и это рисует правило путем повторения множества мелких частей.

документация ulem

Этот недостаток тот же, что и у решения в soulпакете, ссылка на который приведена выше.

Связанный контент