labeling-Umgebung: Zwei Zeilen untereinander

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


inquietus
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 67
Registriert: Sa 9. Mai 2009, 11:42

labeling-Umgebung: Zwei Zeilen untereinander

Beitrag von inquietus »

Hallo,

in dem Minimalbeispiel unten habe ich einen Code "zerhackstückt", den Markus Kohm auf eine ganz andere Frage hin entworfen hat. Ich habe ihn verwendet, weil er an einer Stelle zufällig genau das tut, was ich gerne hätte, nämlich eine Liste von z.B. Programmpunkten mit jeweils einer näheren Angabe dazu. Von der Anordnung her soll es genau so aussehen, wie es das Minimalbeispiel ausgibt.
Meine Frage: wie kann ich den Code noch verändern, damit nur die gewünschte Funktion bleibt? Zum Beispiel brauch ich ja das zweite Argumente gar nicht.
Gibt es vielleicht noch eine elegantere Lösung für diese Aufgabe?

Danke,
viele Grüße
Christian
\documentclass[9pt,a5paper,DIV16]{scrartcl}
\usepackage[german]{babel}
\usepackage[T1]{fontenc}
\usepackage{blindtext,ifthen}
\usepackage{microtype}
\typearea{16}

\raggedbottom

\newcommand{\lv}[3]{%
\begin{labeling}{\textbf{12345}}
\item[\textls{\MakeUppercase{#1}}] {\raggedright\strut\textbf{\ignorespaces #2}\\[4pt]
\ifthenelse{\equal{#3}{}}{}{\strut\ignorespaces #3\\}}
%\ifthenelse{\equal{#4}{}}{\textbf{#5}}{#4%
%\ifthenelse{\equal{#5}{}}{}{\hfill\\\textbf{#5}}%
%}%
\end{labeling}
}

\begin{document}

\lv{Abc Text}{}{Text Text Text}

\lv{Musik}{}{Text Text Text}


\end{document}


Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Indem Du alles, was zum zweiten Argument gehört rauswirfst. Beispielsweise so:
 \documentclass[fontsize=9pt,paper=a5,DIV=16,pagesize]{scrartcl} % alte Optionen durch neue ersetzt
 \usepackage[german]{babel} 
 \usepackage[T1]{fontenc} 
 \usepackage{blindtext,ifthen} 
 \usepackage{microtype} 
 \typearea{16} 
 
 \raggedbottom 
 
 \newcommand{\lv}[2]{% 
 \begin{labeling}{\textbf{12345}} 
 \item[\textls{\MakeUppercase{#1}}]\hspace{0pt}\\
 \ifthenelse{\equal{#2}{}}{}{\strut\ignorespaces #2}
 \end{labeling} 
 } 
 
 \begin{document} 
 
 \lv{Abc Text}{Text Text Text} 
 
 \lv{Musik}{Text Text Text} 
 
 
 \end{document}
Es sei darauf hingewiesen, dass \textsl im Beispiel eher schlecht sperrt. So ist die Zeichenfolge »MUS« mit dem Lochbildner »U« im Vergleich zur Zeichenfolge »SIK« zu stark gesperrt, was eine unruhige Grauverteilung ergibt. Näheres zum Sperren von Versalien sei der Literatur entnommen.

inquietus
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 67
Registriert: Sa 9. Mai 2009, 11:42

Beitrag von inquietus »

Hallo Markus,

danke für die Verbesserung.

OT:
Zum Sperren: das Büchlein kenne ich. Aber wie greife ich korrigierend in die Sperrungen des microtype-Befehls ein. Oder sollte man sowas händisch mit kern-Befehlen machen?

Gruß,
Christian

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Du kannst mit \textls die Grundsperrung vornehmen und diese für einzelne Zeichen mit \kern korrigieren. Ob microtype dazu eine automatische Alternative bietet, kann ich auswenig nicht sagen. Sollte dem so sein, müsste es aber in der Anleitung erwähnt sein. Da ich selbst mit Versalsatz extrem sparsam umgehe (ich finde ihn einfach nur scheußlich), mache ich den komplett manuell.

Achja: Das Ergebnis von \textls hängt AFAIK auch sehr von der Kerningtabelle des Fonts ab. Viele Fonts haben bei Versalkombinationen nur extrem wenige Einträge. Besser wird es daher oft mit \textsc{\MakeLowercase{Foo}}, denn in den Small-Capitals sind für die Kleinbuchstaben oftmals sehr viel mehr Kerningeinträge zu finden. Das hat außerdem den Vorteil, dass die Versalien bereits etwas kleiner gesetzt werden. Natürlich ist das auch wieder nur ein Hack.

Benutzeravatar
domwass
TeX-Entwickler
TeX-Entwickler
Beiträge: 617
Registriert: Di 26. Aug 2008, 12:44
Kontaktdaten:

Beitrag von domwass »

Mit microtype kann man die Grundeinstellung, wie sehr gesperrt werden soll, ändern (siehe Doku) und außerdem auch das optionale Argument von \textls verwenden, um die Sperrung anzupassen, also z.B.
\textls[50]{MUS}
Der Standardwert ist '100', wenn ich mich recht erinnere.

Gruß,
Dominik.-

inquietus
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 67
Registriert: Sa 9. Mai 2009, 11:42

Beitrag von inquietus »

Obzwar dies alles schon OT war, danke für alle Hinweise.

inquietus
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 67
Registriert: Sa 9. Mai 2009, 11:42

Beitrag von inquietus »

Hallo,

ich habe noch ein Problem mit der labeling-Umgebung. Ich verstehe einfach nicht, wie die vertikalen Abstände zustande kommen und wie man sie verändern kann.
Was ich gerne ändern würde, ist der vertikale Abstand zwischen zwei items, wenn das zweite Argument leer ist. Es soll dann nur eine Leerzeile, nicht aber zwei Leerzeilen eingefügt werden.
Und was ich überhaupt nicht verstehe ist das merkwürdige Verhalten der vspace-Befehle. Da ich nicht in der Lage bin, die Befehlsdefinition so zu verändern, daß nur eine Leerzeile eingefügt wird, dachte ich mir, mich mit händischen Korrekturen zu behelfen. Aber: Wie in dem Minimalbeispiel sichtbar wird, hat der erste vspace-Befehl nahezu keine Wirkung. Woher kommt das?

Wie immer vielen Dank im voraus für jede Hilfe!

Gruß,
Christian
\documentclass[paper=12cm:20cm,pagesize,fontsize=10pt]{scrartcl} 
 \usepackage[german]{babel}
 \usepackage[ansinew]{inputenc}
 \usepackage[T1]{fontenc}
 \usepackage{ifthen}
 \usepackage{microtype}
 
 \raggedbottom
 
 \newcommand{\abl}[2]{%
 \begin{labeling}{\hspace{2em}}
 \item[{\Large\textls{\textsc{\MakeLowercase{#1}}}}]\hspace{0pt}\\
 \ifthenelse{\equal{#2}{}}{}{\strut\ignorespaces #2}
 \end{labeling}
 }
 
 
\begin{document}
 
 \abl{Abc}{Text Text Text}
 
 \abl{Musik}{Text Text Text}
 
 \abl{Musik}{}
 
 \abl{Musik}{}
 
 \vspace{-0.5cm}
 \abl{Musik}{}
 
 \clearpage
 
 \abl{Musik}{Text Text Text}
 
 \abl{Musik}{}
 
 \vspace{-20pt}
 \abl{Musik}{}
 
 \end{document}

Benutzeravatar
KOMA
TeX-Entwickler
TeX-Entwickler
Beiträge: 2958
Registriert: Fr 4. Jul 2008, 17:28
Kontaktdaten:

Beitrag von KOMA »

Die vertikalen Abstände von labeling sind die normalen vertikalen Listenabstände. Näheres dazu ist in guten Büchern für fortgeschrittene Anwender wie TLC2 oder der Doku des LaTeX-Kernels, source2e.pdf, zu entnehmen. Kurz gesagt gibt es folgende Längen speziell für Listen:
  • \topsep - Abstand vor dem ersten Eintrag
  • \partopsep - Zusätzlicher Abstand, wenn die Liste auch einen neuen Absatz darstellt
  • \itemsep - Abstand zwischen einzelnen Einträgen
  • \parsep - Absatzabstand innerhalb von Einträgen
Wenn Du keine Extra-Leerzeile haben willst, wenn das zweite Argument leer ist, dann lass den expliziten Zeilenumbruch in diesem Fall weg, also hier:
\item[{\Large\textls{\textsc{\MakeLowercase{#1}}}}]\hspace{0pt}\\ 
 \ifthenelse{\equal{#2}{}}{}{\strut\ignorespaces #2}
den Umbruch nur durchführen, wenn das zweite Argument nicht leer ist:
\item[{\Large\textls{\textsc{\MakeLowercase{#1}}}}]%
 \ifthenelse{\equal{#2}{}}{}{\hspace{0pt}\\\strut\ignorespaces #2}
Im Wiki ist in der Erklärung zu \vspace zu finden, dass der Abstand zwischen zwei Absätzen eingefügt wird (wobei es hier um native TeX-Absätze geht). Verwendet man \vspace innerhalb eines Absatzes, so wird der Abstand erst nach der aktuellen Zeile eingefügt. Innerhalb von Listen ist das ein wenig verwirrend, weil eigentlich erst nach dem Studium der Definition von Listen verständlich wird, wo denn nun genau ein \vspace, der vor einem \item oder innerhalb des optionalen Argument von \item oder nach dem optionalen Argument von \item eingefügt wird.

inquietus
Forum-Fortgeschrittener
Forum-Fortgeschrittener
Beiträge: 67
Registriert: Sa 9. Mai 2009, 11:42

Beitrag von inquietus »

Hi Markus,

vielen Dank für Deine Hilfe. Ich hatte diese if-then-Konstruktion bisher gar nicht verstanden.
Danke auch für die anderen Hinweise.

Christian

Antworten