
Я использую модифицированную версию 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}