Post by Friedrich VosbergLiebe Leute,
wie bekomme ich's hin, dass die Länge der horizontalen Linien in folgendem
Minimalbeispiel rechtsbündig im selben Abstand vom Seitenrand enden?
Lieber Friedrich Vosberg,
erstens ist "..., dass die Länge ... enden" kein korrektes Deutsch.
Zweitens ist eine Länge eine Quantität/eine physikalische Größe und
somit etwas Abstraktes, während das Verb "enden" sich hier aber wohl
nicht auf etwas Abstraktes bezieht, sondern auf etwas, das man sich
auch als sinnliche Anschauung vorstellen/denken kann.
Mir ist deshalb nicht ganz klar, was genau du möchtest.
Wie lautet die Regel, die den Verlauf und die Länge der Linien
bestimmen soll?
Wie lautet die Regel für die Platzierung der Bemerkungen, die
unterhalb der Linien stehen?
Post by Friedrich VosbergMit bestem Gruß aus Leipzig
Friedrich Vosberg
\documentclass{minimal}
\begin{document}
eine Angabe
\parbox[t]{.6\linewidth}{\rule{\linewidth}{.4pt}\\\centerline{(Bitte tragen
Sie hier etwas ein.)}}
eine andere Angabe
\parbox[t]{.6\linewidth}{\rule{\linewidth}{.4pt}\\\centerline{(Bitte tragen
Sie hier etwas anderes ein.)}}
\end{document}
Generelle Bemerkungen:
Du möchtest offenbar mit (La)TeX irgendwelche Linien malen.
TeX malt, wenn man nichts anderes angibt, Linien, die mittels
\rule oder \hrule oder \vrule erzeugt werden, mit einer
Strichstärke von 0.4pt.
Mögliche Problemquelle wenn man Linien malt:
0.4pt als Standard-Strichstärke bei TeX ist recht dünn.
Wenn man Dokumente vor dem Druck kleiner skaliert, z.B., um
zwei Seiten des Dokuments nebeneinander auf eine Seite eines
Blattes Papier zu bekommen, werden die Strichstärken kleiner -
es kann recht schnell passieren, dass sie bei Kleinskalierungs-
aktionen so klein werden, dass z. B. ein herkömmlicher
Tintenstrahldrucker die betreffenden Linien nicht druckt.
Generell, wenn man Linien malt, muss man also einrechnen, ob
man das alles hinterher vielleicht mal kleiner skalieren will
und ob der verwendete Drucker noch mitmacht wenn die
Strichstärken der Linien durchs Kleinerskalieren kleiner sind.
Horizontale Linien kann man recht problemlos basteln, indem man
mit horizontalen \leaders der Form \hrule und mit \hskip
arbeitet.
Zum Beispiel bewirkt die Anweisung
\leaders\hrule\hskip .3\textwidth plus 1 fill
, wenn TeX beim Ausführen dieser Anweisung im horizontalen
Modus ist, in dem TeX Absätze selbst in Zeilen umbricht, dank
\hskip .3\textwidth plus 1 fill
das Erzeugen eines horizontalen Zwischenraums, dessen Breite
den in der betreffenden Absatzzeile verfügbaren horizontalen
Platz ausfüllt und mindestens ca. ein Drittel der Textbreite
beträgt.
Dank \leaders\hrule ist dieser horizontale Zwischenraum
nicht leer, sondern mit einer horizontalen Linie auf der
Basislinie der betreffenden Absatzzeile gefüllt, die TeX,
da bei \hrule keine Parameter angegeben sind, in einer Strichstärke
von 0.4pt zeichnet.
(Wenn man diese horizontale Linie als rechteckigen Balken
betrachtet, ist die untere Begrenzungslinie dieses Balkens
mit der Basislinie der betreffenden Absatzzeile identisch
und die obere Begrenzungslinie dieses Balkens liegt 0.4pt
über der Basislinie der betreffenden Absatzzeile.)
Zum Thema "in der Absatzzeile verfügbarer horizontaler Platz":
Wieviel Platz da verfügbar ist, hängt davon ab, was in der
betreffenden Absatzzeile sonst noch alles vor und/oder hinter
diesem horizontalen Zwischenraum stehen soll.
Ggfs muss man mittels `\nobreak` oder ähnlichem dafür sorgen,
dass die folgende "Zwischenraumanweisung" selbst nicht als ein
Indikator dafür gesehen wird, dass an der betreffenden Stelle
im zu setzenden Text ggfs statt eines horizontalen Zwischenraums
ein Zeilenumbruch gemacht werden darf.
Zum Thema "horizontale Zwischenräume und Zeilenumbrüche":
Ein horizontaler Zwischenraum an einem Zeilenumbruch wird
normalerweise entfernt - Stichwort "discardable glue".
D.h. er bewirkt normalerweise nicht, dass am rechten Ende der
Zeile vor dem Umbruch oder am linken Ende der Zeile nach dem
Umbruch entsprechend eingerückt wird.
Wenn du also eine Linie willst, die die Absatzzeile bis auf
einen zusätzlichen rechten Rand horizontal ausfüllt, kannst du
zwei horizontale Zwischenräume hintereinander setzen, einen
mittels \leaders\hrule mit Linie gefüllt, einen leer:
\nobreak \leaders\hrule\hskip .3\textwidth plus 1 fill \nobreak \hskip 2cm \null
, gefolgt von \\ oder \par oder was auch immer geeignet
erscheint, (auch) das Zeilenende zu bewirken.
Auch wenn mir nicht ganz klar ist, was genau du möchtest, habe
ich trotzdem auf Verdacht für den horizontalen Modus ein Makro
\Schreibstrich mit der folgenden Syntax zusammengefrickelt:
\Schreibstrich{<Minimalbreite des Schreibstriches>}%
{<horizontaler Leerraum am Absatzzeilenende>}%
{<Text, der mittig unter den Schreibstrich soll>}
Dieses Makro ist dazu gedacht, entlang der Basislinie
der Absatzzeile einen horizontalen Strich zu malen, der mindestens
eine Länge hat, die der <Minimalbreite des Schreibstriches> entspricht
und die Absatzzeile so ausfüllt, dass rechts von diesem Strich bis zum
rechten Textrand ein leerer Zwischenraum der Breite
<horizontaler Leerraum am Absatzzeilenende> bestehen bleibt.
Unter dem Strich erscheint, horizontal zum Strich zentriert,
der <Text, der mittig unter den Schreibstrich soll>.
Da die Strichlänge variabel sein soll, braucht man für die
Positionierung des Textes, der unter den Linien horizontal zentriert
sein soll, eine Möglichkeit, Anfangs- und Endpunkte der Linien zu
referenzieren.
Das kann man z.B. mit TikZ machen, indem man picture-
Umgebungen verwendet und dort, wo TeX die Anfangs- und Endpunkte
der Linien setzt, benannte Koordinaten setzt und mittels
der Umgebungsoptionen "overlay" und "remember picture"
speichert und anderen picture-Umgebungen zugänglich macht.
Bei diesem Ansatz muss man aber die .tex-Datei mindestens
zweimal compilieren und die diesbezüglichen Meldungen von
TeX auf der Konsole und in der .log-Datei beachten.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand\Schreibstrich[3]{%
% Speichere die Koordinate des linken Strichendes
% unter dem Namen LineStart:
\begin{tikzpicture}[overlay, remember picture]%
\coordinate (LineStart) at (0,0) ;
\end{tikzpicture}%
% Male den Strich:
\nobreak \leaders\hrule\hskip\dimexpr(#1)\relax plus 1 fill
% Speichere die Koordinate des rechten Strichendes
% unter dem Namen LineEnd und schreibe den Text unter
% den Strich:
\begin{tikzpicture}[overlay, remember picture]%
\coordinate (LineEnd) at (0,0) ;
\node [below] (LineText) at ($(LineStart)!0.5!(LineEnd)$) {#3};
\end{tikzpicture}%
% Mache am Zeilenende einen horizontalen Leerraum:
\nobreak \hskip\dimexpr(#2)\relax\null
}%
\begin{document}
\noindent\hrule
\vskip 1.5cm
\hfill Das sind 2cm: \leaders\hrule\hskip 2cm \null
\vskip 1.5cm
\noindent
Eine Angabe:~%
\Schreibstrich{.3\textwidth}{2cm}{(Bitte tragen Sie hier etwas ein.)}%
\vskip 1.5cm
\noindent
Eine andere Angabe:~%
\Schreibstrich{.3\textwidth}{2cm}{(Bitte tragen Sie hier etwas anderes ein.)}%
\vskip 1.5cm
\noindent\hrule
\end{document}
Man beachte, dass bei diesem Beispiel die Linien bzw. die Balken, die
die Striche der Linien darstellen, ihre obere Begrenzungslinie oberhalb der
Basislinie der betreffenden Textzeile haben.
Da mag man aber vielleicht schreiben.
Deshalb wird oft gewünscht, dass diese Balken sich ein kleines bisschen
unterhalb der Basislinie der betreffenden Textzeile befinden.
Um dies zu erreichen, kann man bei der betreffenden \hrule-Anweisung
eine etwas größere Tiefe und eine negative Höhe angeben, die betragsmäßig
kleiner als die Tiefe sein muss:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand\Schreibstrich[3]{%
% Speichere die Koordinate des linken Strichendes
% unter dem Namen LineStart:
\begin{tikzpicture}[overlay, remember picture]%
\coordinate (LineStart) at (0,0) ;
\end{tikzpicture}%
% Male den Strich etwas unterhalb der Basislinie der Absatzzeile:
\nobreak \leaders\hrule depth .8pt height -.4pt \hskip\dimexpr(#1)\relax plus 1 fill
% Speichere die Koordinate des rechten Strichendes
% unter dem Namen LineEnd und schreibe den Text unter
% den Strich:
\begin{tikzpicture}[overlay, remember picture]%
\coordinate (LineEnd) at (0,0) ;
\node [below] (LineText) at ($(LineStart)!0.5!(LineEnd)+(0, -.8pt)$) {#3};
\end{tikzpicture}%
% Mache am Zeilenende einen horizontalen Leerraum:
\nobreak \hskip\dimexpr(#2)\relax\null
}%
\begin{document}
\noindent\hrule
\vskip 1.5cm
\hfill Das sind 2cm: \leaders\hrule\hskip 2cm \null
\vskip 1.5cm
\noindent
Eine Angabe:~%
\Schreibstrich{.3\textwidth}{2cm}{(Bitte tragen Sie hier etwas ein.)}%
\vskip 1.5cm
\noindent
Eine andere Angabe:~%
\Schreibstrich{.3\textwidth}{2cm}{(Bitte tragen Sie hier etwas anderes ein.)}%
\vskip 1.5cm
\noindent\hrule
\end{document}
Wenn man keine durchgehenden Linien, sondern einen anderen Linienstil möchte,
ist das auch kein Problem:
Bei der Anweisung
\nobreak \leaders\hrule\hskip\dimexpr(<Mindestbreite des Striches>)\relax plus 1 fill
kann man statt \hrule auch eine \hbox nehmen, die eine Instanz dessen enthält,
womit der horizontale Zwischenraum gefüllt wird.
Also etwas in der Art
\nobreak \leaders\hbox to 3pt{\hfill.\hfill}\hskip\dimexpr(<Mindestbreite des Striches>)\relax plus 1 fill
.
Um sich inspirieren zu lassen, kann man z.B. das Makro \dotfill anschauen.
Da TeX bei der Frage, wie dieser Zwischenraum mit Instanzen des als \hbox
Angegebenen gefüllt wird, aber ein paar Eigenheiten hat, die, je nachdem,
ob man \leaders oder \cleaders oder \xleaders verwendet, unterschiedlich
sind, und nicht unbedingt zum optimalen Ergebnis führen, schlage ich eine
andere Vorgehensweise vor:
Man lasse diesen horizontalen Zwischenraum einfach leer:
\nobreak \hskip\dimexpr(<Mindestbreite des Striches>)\relax plus 1 fill
und verwende die vom TiKz-Paket bereitgestellten Mittel, um die Linie
zwischen den Koordinaten zu zeichnen:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand\Schreibstrich[3]{%
% Speichere die Koordinate des linken Strichendes
% unter dem Namen LineStart:
\begin{tikzpicture}[overlay, remember picture]%
\coordinate (LineStart) at (0,0) ;
\end{tikzpicture}%
% Leerer Zwischenraum in Strichbreite:
\nobreak \hskip\dimexpr(#1)\relax plus 1 fill
% Speichere die Koordinate des rechten Strichendes
% unter dem Namen LineEnd und male den Strich und schreibe
% den Text unter den Strich:
\begin{tikzpicture}[overlay, remember picture]%
\coordinate (LineEnd) at (0,0) ;
% Linie mit Text darunter von LineStart nach LineEnd malen:
% Linienstil ist hier densely dotted, pgfmanual.pdf erklärt
% die verschiedenen Linienstile und Optionen des \draw-Befehls.
% Der Text, der unter den Strich soll, wird im "node"-Teil zur
% Beschriftung der Linie.
\draw [densely dotted, black, line width=.4pt]%
($(LineStart)+(0,-.4pt)$)
-- ($(LineEnd)+(0,-.4pt)$)
node [below] at ($(LineStart)!0.5!(LineEnd)+(0,-.4pt)$) {#3};
\end{tikzpicture}%
% Mache am Zeilenende einen horizontalen Leerraum:
\nobreak \hskip\dimexpr(#2)\relax\null
}%
\begin{document}
\noindent\hrule
\vskip 1.5cm
\hfill Das sind 2cm: \leaders\hrule\hskip 2cm \null
\vskip 1.5cm
\noindent
Eine Angabe:~%
\Schreibstrich{.3\textwidth}{2cm}{(Bitte tragen Sie hier etwas ein.)}%
\vskip 1.5cm
\noindent
Eine andere Angabe:~%
\Schreibstrich{.3\textwidth}{2cm}{(Bitte tragen Sie hier etwas anderes ein.)}%
\vskip 1.5cm
\noindent\hrule
\end{document}
Mit freundlichem Gruß
Ulrich