TikZ-Knoten als Zeichen im Text

TikZ-Knoten als Zeichen im Text

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: Ausgabe von MWE

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 sloppyparkönnen Sie das Problem vorübergehend beheben. Dieses Problem tritt bei übergroßen Feldern auf, die am Ende einer Zeile gesetzt werden sollen.

Die sloppyparFunktion (oder \sloppydas 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}

Bildbeschreibung hier eingeben

Antwort2

Hier ist eine Version, die Zeilenumbrüche zulässt und in beiden Teilen ein offenes Rechteck verwendet. \tikzmarkwird verwendet, um den Anfang und das Ende des Textes zu markieren, und die Ovale werden gezeichnet, nachdem der Text gesetzt wurde:

Bildbeschreibung hier eingeben

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 \RoundedCornerkann nicht größer sein als der aktuelle Wert von 2.0pt, da sonst Artefakte in der abgerundeten Ecke entstehen. arcWenn ein größerer Radius gewünscht wird, kann stattdessen vielleicht ein manuell gezeichneter Wert verwendet werden.

  • Der Wert von \InnerSepkann angepasst werden, um den zusätzlichen horizontalen Abstand anzupassen, der hinzugefügt wirdVorUndnachder Text.

  • Das \tikzmarkist vonHinzufügen einer großen Klammer neben einem Textkörper.

  • Sie können die Kommentierung aufhebenDas showframePaket 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}

verwandte Informationen