
Ich verwende eine modifizierte Version der TikZ-Lösung ineine andere Frageabgerundete Rechtecke um einen Text zu zeichnen, um ihn als Schaltfläche eines Programms zu kennzeichnen. Bei einzelnen Buchstaben ist das kein Problem, aber wenn ich längere Begriffe verwende (wie die Schaltflächen in meinem Programm benannt sind), bekomme ich Probleme mit überfüllten \hboxes.
MWE:
\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}
Die erzeugte Ausgabe sieht folgendermaßen aus:
Gibt es eine bessere Lösung, um solche überfüllten \hboxen zu vermeiden, als den Satz so lange neu anzuordnen, bis er kein Problem mehr verursacht?
Antwort1
Mit A sloppypar
können Sie das Problem vorübergehend beheben. Dieses Problem tritt bei übergroßen Feldern auf, die am Ende einer Zeile gesetzt werden sollen.
Die sloppypar
Funktion (oder \sloppy
das gesamte Dokument) ändert die Strafen von TeX, um mehr Wert auf die Vermeidung von Randüberschreitungen zu legen, auf Kosten von extrem großen Wortzwischenräumen. Es gibt kein „kostenloses Mittagessen“.
\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}
Antwort2
Hier ist eine Version, die Zeilenumbrüche zulässt und in beiden Teilen ein offenes Rechteck verwendet. \tikzmark
wird verwendet, um den Anfang und das Ende des Textes zu markieren, und die Ovale werden gezeichnet, nachdem der Text gesetzt wurde:
Anmerkungen:
Hierzu sind zwei Durchgänge erforderlich. Zunächst zum Bestimmen der Standorte und dann zum Anfertigen der Zeichnung.
Dies funktioniert nicht, wenn der Text die Seitengrenzen überschreitet.
Der Wert von
\RoundedCorner
kann nicht größer sein als der aktuelle Wert von2.0pt
, da sonst Artefakte in der abgerundeten Ecke entstehen.arc
Wenn ein größerer Radius gewünscht wird, kann stattdessen vielleicht ein manuell gezeichneter Wert verwendet werden.Der Wert von
\InnerSep
kann angepasst werden, um den zusätzlichen horizontalen Abstand anzupassen, der hinzugefügt wirdVorUndnachder Text.Das
\tikzmark
ist vonHinzufügen einer großen Klammer neben einem Textkörper.Sie können die Kommentierung aufhebenDas
showframe
Paket um die Seitenränder anzuzeigen.
Code:
\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}