Узел TikZ как символ в тексте

Узел TikZ как символ в тексте

Я использую модифицированную версию TikZ-solution вДругой вопроснарисовать скругленные прямоугольники вокруг текста, чтобы отметить его как кнопку программы. Это не проблема для отдельных символов, но если я использую более длинные термины (так кнопки называются в моей программе), у меня возникают проблемы с Overfull \hboxes.

МВЭ:

\documentclass[a4paper,10pt]{scrartcl}
\usepackage{tikz}

\newcommand*\rectangled[1]{\tikz[baseline=(char.base)]{
    \node[shape=rectangle,draw,inner sep=2pt, rounded corners=4pt, thick] (char) {\sffamily{#1}};}}

\begin{document}
  A rectangled number \rectangled{1}: No problem normally as it is used as normal charakter and TeX can set it in the right position.

  A button with a longer name is marked using the same command and \rectangled{creates an Overfull \textbackslash hbox} if it is set to the end of a line.
\end{document}

Полученный результат выглядит следующим образом: Выход МВЭ

Есть ли лучшее решение, чтобы избежать таких переполненных \hboxes, чем переставлять предложение до тех пор, пока оно не перестанет вызывать проблемы?

решение1

A sloppyparпозволит вам на мгновение преодолеть эту проблему. Эта проблема возникает для любого слишком большого блока, который нужно набрать в конце строки.

Эта sloppyparфункция (или \sloppyдля всего документа) изменяет штрафы TeX, чтобы больше внимания уделять предотвращению переполнения полей за счет чрезмерно широких межсловных пробелов. "Бесплатного обеда" не существует.

\documentclass[a4paper,10pt]{scrartcl}
\usepackage{tikz}

\newcommand*\rectangled[1]{\tikz[baseline=(char.base)]{
    \node[shape=rectangle,draw,inner sep=2pt, rounded corners=4pt, thick] (char) {\sffamily#1};}}

\begin{document}
  A rectangled number \rectangled{1}: No problem normally as it is used as normal charakter and TeX can set it in the right position.

\begin{sloppypar}
  A button with a longer name is marked using the same command and \rectangled{creates an Overfull \textbackslash hbox} if it is set to the end of a line.
\end{sloppypar}
\end{document}

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

решение2

Вот версия, которая допускает переносы строк и использует открытый прямоугольник с обеих сторон. \tikzmarkиспользуется для обозначения начала и конца текста, а овалы рисуются после того, как текст был набран:

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

Примечания:

  • Для этого требуется два захода. Первый — для определения локаций, второй — для рисования.

  • Это не сработает, если текст выходит за границы страницы.

  • Значение \RoundedCornerне может быть больше текущего значения 2.0pt, в противном случае в закругленном углу появятся артефакты. Возможно, arcвместо этого можно использовать нарисованный вручную угол, если требуется больший радиус.

  • Значение \InnerSepможно настроить, чтобы отрегулировать дополнительный горизонтальный интервал, который добавляется.доипослетекст.

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

  • Вы можете раскомментироватьпакетshowframe чтобы увидеть поля страницы.

Код:

\documentclass{article}

%\usepackage{showframe}% to see page boundaries

\usepackage{tikz,tikzpagenodes}
\usetikzlibrary{decorations.pathreplacing}

\newcommand*{\InnerSep}{1pt}% Only applied to x directions
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node[inner sep=0] (#1) {};}

%% https://tex.stackexchange.com/questions/33703/extract-x-y-coordinate-of-an-arbitrary-point-in-tikz
\newdimen\XCoordA
\newdimen\YCoordA
\newdimen\XCoordB
\newdimen\YCoordB
\newcommand*{\ExtractCoordinate}[3]{\path (#3); \pgfgetlastxy{#1}{#2};}%

\newcommand*{\RoundedCorner}{2.0pt}% <-- MUST NOT BE ANY LARGER
\tikzset{My Line Style/.style={rounded corners=\RoundedCorner, thick, blue}}

\newcommand*\rectangled[2][]{%
    \tikzmark{Start Mark}#2\tikzmark{End Mark}%
    \begin{tikzpicture}[overlay,remember picture]
        \ExtractCoordinate{\XCoordA}{\YCoordA}{Start Mark}
        \ExtractCoordinate{\XCoordB}{\YCoordB}{End Mark}
        \ifdim\YCoordA=\YCoordB% Starts and ends on same line
            \draw[My Line Style,#1]
                ([shift={(-\InnerSep,-0.3*\baselineskip)}]Start Mark.south east) 
                     rectangle 
                ([shift={(\InnerSep,0.7*\baselineskip)}]End Mark.north west)
               ;
        \else% Starts on a different line
            \coordinate (Right Hand Edge) at (Start Mark -| current page text area.east);
            \coordinate (Left Hand Edge)  at (End Mark -| current page text area.west);
            \draw [My Line Style,#1]% Draw start of oval rectangle 
                   ([yshift=-0.3*\baselineskip]Right Hand Edge) 
                -| ([xshift=-\InnerSep]Start Mark.west)
                |- ([yshift=0.7*\baselineskip]Right Hand Edge)
                ;
            \draw [My Line Style,#1]% Draw end of oval rectangle
                   ([yshift=-0.3*\baselineskip]Left Hand Edge) 
                -| ([xshift=\InnerSep]End Mark.east)
                |- ([yshift=0.7*\baselineskip]Left Hand Edge)
                ;
        \fi%
    \end{tikzpicture}%
}

\begin{document}
  A rectangled number \rectangled{1}, or \rectangled[magenta]{word}: No problem
  normally as it is used as normal character and TeX can set it in the right position.

  A button with a longer name marked using the same command \rectangled[red]{used to 
  create an Overfull \textbackslash hbox} if it was set to the end of a line.

  A button with a even longer name \rectangled[brown]{no longer creates a Overfull 
  \textbackslash hbox when it crosses a line} boundary.
\end{document}

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