Tikz: Latexlänge für Pfadlänge verwenden (ebenfalls Markierungen)

Tikz: Latexlänge für Pfadlänge verwenden (ebenfalls Markierungen)

Ich möchte eine Ditto-Linie zeichnen, also eine horizontale Linie mit zwei kleinen Markierungen in der Mitte.

Mein erster Versuch \dittoLatexverwendete eine Box mit Charakteren und Regeln, war aber ehrlich gesagt hässlich.

Mein zweiter Versuch \dittotikzAsah zwar viel besser aus, berechnet seine Breite jedoch nicht automatisch anhand eines Arguments.

Mein dritter Versuch ist \dittotikzBder, bei dem dieselbe Methode zur Berechnung der Breite wie verwendet wird \dittoLatex, aber es funktioniert nicht. Ich vermute, das Problem liegt an nicht übereinstimmenden Einheiten, aber ich kann nicht herausfinden, wie ich es beheben kann.

MWE:

\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{xparse}

\makeatletter

\usepackage{tikz}
\usetikzlibrary{math}

\newcommand\dittotikzA[1][3em]{%
    \def\x{#1/4}%
    %\show\x%
    \def\y{#1*.01}%
    \begin{tikzpicture}[x=1ex,y=1ex,baseline=-.5ex,cap=round]
        \draw (0,0) sin (1*\x,\y) cos (2*\x,0) sin (3*\x,-\y) cos (4*\x,0);
        \draw[xshift=-.2ex, bend right=20] (2*\x-.5,-.5) edge (2*\x+.5,.5);
        \draw[xshift=.2ex, bend right=20] (2*\x-.5,-.5) edge (2*\x+.5,.5);
    \end{tikzpicture}%
}


\newlength{\ditto@width}
\NewDocumentCommand\dittotikzB{ s O{1em} m }{%
    % #1 = starred means horizontal line along entire width, unstarred means no line (only ditto marks)
    % #2 = minimum width
    % #3 = string to use for calculating width
    \settowidth{\ditto@width}{#3}%
    %\show\ditto@width%
    \edef\w{\ifdim#2<\ditto@width\the\ditto@width\else#2\fi}
    %\show\w%
    \begin{tikzpicture}[x=1ex,y=1ex,baseline=-.5ex,cap=round]
        \tikzmath{
            \xfactor = \w / 4 * 1pt/1ex;
            \yfactor = .175;
        };
        %\show\xfactor;
        %\show\yfactor;
        \IfBooleanT{#1}{% starred
            \draw (0,0) sin (1\xfactor, \yfactor) cos (2\xfactor, 0) sin (3\xfactor, -\yfactor) cos (4\xfactor, 0);
        };
        \draw[xshift=-.2ex, bend right=20] (2\xfactor - .5, -.5) edge (2\xfactor + .5, .5);
        \draw[xshift=.2ex, bend right=20] (2\xfactor - .5, -.5) edge (2\xfactor + .5, .5);
    \end{tikzpicture}%
}


\usepackage{xhfill}
\newcommand\ditto@symbol{%
    ||%
}
\NewDocumentCommand\dittoLatex{ s O{1em} m }{%
    % #1 = starred means horizontal line along entire width, unstarred means no line (only ditto marks)
    % #2 = minimum width
    % #3 = string to use for calculating width
    \settowidth{\ditto@width}{#3}%
    \makebox[{\ifdim#2<\ditto@width\ditto@width\else#2\fi}]{%
        \IfBooleanTF{#1}{% starred
            \xrfill[.5ex]{.4pt}%
            \ditto@symbol%
            \xrfill[.5ex]{.4pt}%
        }{%
            \ditto@symbol%
        }%
    }%
}

\makeatother

\begin{document}

\let\ditto=\dittotikzA
\noindent
blah blah \ditto{} blah blah\\
blah blah \ditto[10em]{} blah blah\\

\let\ditto=\dittotikzB
\noindent
blah blah Test blah blah\\
blah blah \ditto{Test} blah blah\\
blah blah \ditto*{Test} blah blah\\
blah blah Testing testing blah blah\\
blah blah \ditto{Testing testing} blah blah\\
blah blah \ditto*{Testing testing} blah blah\\
blah blah \ditto{} blah blah\\
blah blah \ditto*{} blah blah\\
blah blah \ditto[10em]{Test} blah blah\\
blah blah \ditto*[10em]{Test} blah blah\\
blah blah \ditto[10em]{Testing testing} blah blah\\
blah blah \ditto*[10em]{Testing testing} blah blah\\
blah blah \ditto[10em]{} blah blah\\
blah blah \ditto*[10em]{} blah blah\\

\let\ditto=\dittoLatex
\noindent
blah blah Test blah blah\\
blah blah \ditto{Test} blah blah\\
blah blah \ditto*{Test} blah blah\\
blah blah Testing testing blah blah\\
blah blah \ditto{Testing testing} blah blah\\
blah blah \ditto*{Testing testing} blah blah\\
blah blah \ditto{} blah blah\\
blah blah \ditto*{} blah blah\\
blah blah \ditto[10em]{Test} blah blah\\
blah blah \ditto*[10em]{Test} blah blah\\
blah blah \ditto[10em]{Testing testing} blah blah\\
blah blah \ditto*[10em]{Testing testing} blah blah\\
blah blah \ditto[10em]{} blah blah\\
blah blah \ditto*[10em]{} blah blah\\

\end{document}

Beispiel

Einige verwandte Fragen:

Antwort1

Sie haben die Multiplikationszeichen vergessen. 4\xFaktor ist nicht 4*\xFaktor.

\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{xparse}

\makeatletter

\usepackage{tikz}
\usetikzlibrary{math}
\newcommand\w{}
\newlength{\ditto@width}
\NewDocumentCommand\dittotikzB{ s O{1em} m }{%
    % #1 = starred means horizontal line along entire width, unstarred means no line (only ditto marks)
    % #2 = minimum width
    % #3 = string to use for calculating width
    \settowidth{\ditto@width}{#3}%
    %\show\ditto@width%
    \edef\w{\ifdim#2<\ditto@width\the\ditto@width\else\dimexpr#2\relax\fi}
    %\show\w%
    \begin{tikzpicture}[x=1ex,y=1ex,baseline=-.5ex,cap=round]
        \tikzmath{
            \xfactor = \w / 4 * 1pt/1ex;
            \yfactor = .175;
        };
        %\show\xfactor;
        %\show\yfactor;
        \IfBooleanT{#1}{% starred
            \draw (0,0) sin (1*\xfactor, \yfactor) cos (2*\xfactor, 0) sin (3*\xfactor, -\yfactor) cos (4*\xfactor, 0);
        };
        \draw[xshift=-.2ex, bend right=20] (2*\xfactor - .5, -.5) edge (2*\xfactor + .5, .5);
        \draw[xshift=.2ex, bend right=20] (2*\xfactor - .5, -.5) edge (2*\xfactor + .5, .5);
    \end{tikzpicture}%
}



\makeatother

\begin{document}

\let\ditto=\dittotikzB
\noindent
blah blah Test blah blah\\
blah blah \ditto{Test} blah blah\\
blah blah \ditto*{Test} blah blah\\
blah blah Testing testing blah blah\\
blah blah \ditto{Testing testing} blah blah\\
blah blah \ditto*{Testing testing} blah blah\\
blah blah \ditto{} blah blah\\
blah blah \ditto*{} blah blah\\
blah blah \ditto[10em]{Test} blah blah\\
blah blah \ditto*[10em]{Test} blah blah\\
blah blah \ditto[10em]{Testing testing} blah blah\\
blah blah \ditto*[10em]{Testing testing} blah blah\\
blah blah \ditto[10em]{} blah blah\\
blah blah \ditto*[10em]{} blah blah\\



\end{document}

verwandte Informationen