Ich möchte eine Ditto-Linie zeichnen, also eine horizontale Linie mit zwei kleinen Markierungen in der Mitte.
Mein erster Versuch \dittoLatex
verwendete eine Box mit Charakteren und Regeln, war aber ehrlich gesagt hässlich.
Mein zweiter Versuch \dittotikzA
sah zwar viel besser aus, berechnet seine Breite jedoch nicht automatisch anhand eines Arguments.
Mein dritter Versuch ist \dittotikzB
der, 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}
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}