Sie sind hier

Indexe (Manicule)?

Ich würde gerne Indexe (Manicule) automatisch erstellen.

Die Schwierigkeit ist dabei, dass das Index-Zeichen (☜ / ☞, ☚ / ☛) immer zum Text weisen muss, d.h. Koma-Script muss erkennen, ob die Seite gerade oder ungerade ist.
[Eventuell muss man vor/hinter die umgedrehte Form LTR/LTR setzen oder die Umgebung rechtsläufig machen.]

Wahl des Index-Zeichen-Stils (weiß/schwarz/hoch-runter/emoji) wäre nett.
Optional: Wahl der der Schriftart mit fontspec, regelbare Größe des Index-Zeichens.

Siehe auch:
https://en.wikipedia.org/wiki/Index_(typography)

[Admin-Edit:]

  1. Link korrigiert
  2. Verschoben

forum: 
Bild von Markus Kohm

Für Randmarkierungen jeglicher Art gibt es bereits die LaTeX-Standardanweisung \marginpar. Diese besitzt auch zwei unterschiedliche Argumente, um zwischen Ausgaben für linke und Ausgaben für rechte Seiten unterscheiden zu können. Diese ist auch in der Anleitung und im Buch dokumentiert. Es ist ein leichtes, sich daraus eine eigene Anweisung zu bauen, die einen Text zusammen mit dem jeweiligen Zeichen in der gewünschten Schrift ausgibt. Im einfachsten Fall, beispielsweise etwas wie (mangels vollständigem Minimalbeispiel ungetestet):

\DeclareRobustCommand{\manicule}[1]{\marginpar[{#1 ☛}]{☚ #1}}

Das setzt natürlich einen Font voraus, der diese Zeichen auch enthält. Alternativ kann man entsprechende Symbol-Fonts und deren Befehle für die Zeichen selbst verwenden.

Genau genommen wird hier lediglich Basisfunktionalität von LaTeX verwendet. So dass das bis hier gar keine KOMA-Script-Frage ist.

Bezüglich Befehle für eine Ausrichtung des Textes, Farbe, Schriftart etc. sei auf die einschlägige Literatur zu LaTeX und ebenfalls auf die KOMA-Script-Anleitung und das KOMA-Script-Buch hingewiesen. So böte es sich beispielsweise an für Schrifteinstellungen ein neues Element mit \newkomafont zu definieren und dieses dann mit \usekomafont in obiger Definition zu verwenden. Dadurch wäre dann auch ein gewisser Bezug zu KOMA-Script gegeben. Bezüglich möglicher Probleme bei der Verwendung von \marginpar sei ebenfalls auf die KOMA-Script-Anleitung oder das KOMA-Script-Buch verwiesen.

Übrigens kennt KOMA-Script auch Befehle, um rechte und linke Seiten zu erkennen. Auch diese sind in der Anleitung und im Buch dokumentiert. Hier wird ein solcher IMHO aber nicht zusätzlich benötigt.

Sorry, ich hätte nicht gedacht, dass es prinzipiell so einfach ist.
\DeclareRobustCommand{\manicule}[1]{\marginpar[{#1 ☛}]{☚ #1}}
funktioniert schon mal.
Allerdings nimmt \manicule im fertigen Text den ersten Buchstaben des nächsten Wortes mit, also \manicule Eastern wird zu Randnote ☚E und im Text steht astern. Morgen bereite ich ein Minimalbeispiel vor.

Bild von Markus Kohm

Nun, da nicht genau spezifiziert war, was du haben willst, habe ich einen Befehl mit Argument definiert. Wenn du keinen Befehl mit Argument haben willst, lass das Argument in der Deklaration weg. Wenn du nur manchmal eines haben willst, dann mach ein optionales daraus.

Wie das geht? Lies bitte eine ausführliche LaTeX-Einführung, in der (neben \marginpar) auch Befehle wie \newcommand, \renewcommand und \DeclareRobustCommand erklärt werden. Ich kann hier nicht jedem LaTeX-Anfänger eine individuelle LaTeX-Einführung geben. Das ist auch nicht Thema der Seiten hier.

Nein, ein optionales Argument brauche ich gar nicht.
Also \DeclareRobustCommand{\manicule}{\marginpar[{☛}]{☚}} läuft, aber dann kriege ich Probleme:

\newkomafont{manicule}{\fontspec{Malgun Gothic Semilight}}
\usekomafont{manicule}

wirkt bei mir nicht, die Zeichen werden weiterhin im Standardzeichensatz angezeigt.
Ich habe stundenlang das KOMA-Script-Manual durchgeblättert und Alternativen ausprobiert... was mache ich falsch?

Bild von Markus Kohm

Wie der Anleitung durchaus zu entnehmen ist, wirkt \usekomafont auf die aktuelle Schrift. Es gibt auch massenhaft Beispiele für die Verwendung von \usekomafont hier auf komascript.de. Du willst, dass es auf die Schrift in den beiden Argumenten von \marginpar wirkt, also muss es natürlich auch dort hin (in Ermangelung eines vollständigen Minimalbeispiels ungetestet)::

\DeclareRobustCommand{\manicule}{\marginpar[{\usekomafont{manicule}{☛}}]{\usekomafont{manicule}{☚}}}

Wobei die Verwendung von \fontspec in der von dir gezeigten Form in der fontspec-Anleitung explizit nicht empfohlen wird. Dort wird stattdessen empfohlen, eine neue Familie zu definieren und diese dann zu verwenden.

Neue Familie definiert... und es klappt! Danke :)

\newfontfamily\maniculefont{Segoe UI Symbol}
\newcommand\manicule{\marginpar[{\maniculefont{☛}}]{\maniculefont{☚}}}

Allerdings ist das Index-Zeichen in dieser Schriftart sehr klein...

\newfontfamily\maniculefont{Segoe UI Symbol}[Scale = 1.5]
\newcommand\manicule{\marginpar[{\maniculefont{☛}}]{\maniculefont{☚}}}

Schon besser.
Aber das Index-Zeichen auf linken Seiten sollte rechtsbündig sein. So lange, wie ich nach der Lösung suche, behelfe ich mir mit

\newfontfamily\maniculefont{Segoe UI Symbol}[Scale = 1.5]
\newcommand\manicule{\marginpar[{\maniculefont{~~~~~~☛}}]{\maniculefont{☚}}}

Dann ist da noch der Umstand, das durch die Vergrößerung des Index-Zeichen der Finger fast in den Zeilenzwischenraum des Haupttextes weist. Ich muss also das Zeichen irgendwie leicht absenken...

Bild von Markus Kohm

\raggedright, \raggedleft, \hfill und \hspace*{\fill} dürften in jeder halbwegs vollständigen LaTeX-Einführung zu finden sein.

Mehr werde ich zu dem ganzen nur noch schreiben, wenn es endlich das mehrfach angemahnte vollständige Minimalbeispiel gibt, mit dem ich dann ggf. auch testen kann.

So, das Index-Zeichen auf linken Seiten ist jetzt rechtsbündig:

\newfontfamily\maniculefont{Segoe UI Symbol}[Scale = 1.5]
\newcommand\manicule{\marginpar[{\flushright{\maniculefont{☛}}}]{\maniculefont{☚}}}

Aber dafür macht das Absenken Schwierigkeiten. Ich hatte gedacht, dass das vielleicht über
\raisebox{-3pt}{\manicule}
(mit graphicx) zu lösen wäre, aber \marginpar lässt das nicht zu.

Bild von Markus Kohm

flushright ist wie center eine (trivlist-)Umgebung. Deshalb hatte ich auch nicht das, sondern \raggedleft genannt.

Und natürlich kann es nicht funktionieren, wenn die \marginpar-Anweisung selbst vertikal verschoben wird (ganz davon abgesehen, dass das erhebliche Auswirkungen auf den Zeilenabstand haben könnte). Stattdessen muss die Ausgabe der Anweisung, also ihre Argumente, vertikal verschoben werden. Das wird aber auch nicht immer das bewirken, was man sich so vorstellt, weil \maginpar auch eine Kollisionserkennung beinhaltet. Die Argumente davon erzeugen eine Art Gleitobjekt für den Rand (weshalb es auch nicht in einer Gleitumgebung verwendet werden kann, aber das ist ein anderes Thema). Wenn also die Ausgabe des Argument von \marginpar vertikal verschoben werden soll, muss man folgerichtig \marginpar{\raisebox{-3pt}{foo}} statt \raisebox{-3pt}{\marginpar{foo}} verwenden.

Bitte lies eine ausführliche LaTeX-Einführung oder frag dergleichen in einem allgemeinen LaTeX-Forum. Ich kann hier wirklich nicht jedem einzelnen eine private LaTeX-Einführung geben.

\documentclass[british]{scrbook}
\usepackage{fontspec}
\setcounter{secnumdepth}{3}
\setcounter{tocdepth}{3}
 
\makeatletter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% User specified LaTeX commands.
%%% Manicule:
 
\newfontfamily\maniculefont{Segoe UI Symbol}[Scale = 1.5]
\newcommand\manicule{\marginpar[{\flushright{\maniculefont{☛}}}]{\maniculefont{}}}
 
\makeatother
 
\usepackage{polyglossia}
\setdefaultlanguage[variant=british]{english}
\begin{document}
diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam
erat, sed diam voluptua. At vero eos et accusam et justo duo dolores
et ea rebum. Stet clita kasd \manicule gubergren... [Einfach den Absatz so lange kopieren/einfügen, bis man eine rechte und eine linke Seite hat.]
\end{document}
Bild von Markus Kohm

Da das Beispiel zwingend auf einen bestimmten Font angewiesen ist, der nicht Bestandteil von TeX Live ist, ist das Beispiel bei mir so nicht lauffähig. Ich bräuchte also min. eine legale kostenlose Quelle für den Font. Besser ist, wenn man solche Abhängigkeiten vermeidet.

Entschuldigung, ich hatte die Seite nicht neu geladen. Daher habe ich Deine Kommentare erst im Nachhinein gelesen. Das mit \marginpar{\raisebox{-3pt}{foo}} habe ich schon selbst gemerkt.
Ich weiß nicht, welche Fonts in TeX Live sind, die das Index-Zeichen enthalten. Versuch mal Code2000...
PS: Also \raggedleft funktioniert schon mal, danke!
PPS: Aber \newcommand\manicule{\marginpar{\raisebox{-4pt}{[{\raggedleft{\maniculefont{☛}}}]{\maniculefont{☚}}}}} gibt [☛]☚ statt ☚ aus.
Du brauchst mir nicht zu helfen, das ist nur Dokumentation; hoffentlich finde ich selbst die Lösung.

Bild von Markus Kohm

Falsche Klammerung. Überlege, welches die Klammern von welchem Befehl sind, dann kommst Du sicher selbst darauf.

Welche Fontpakete in gängigen TeX-Distributionen enthalten sind, kann man im CTAN-Katalog sehen. Irgendwelche Systemfonts von Windows oder MacOS gehören eher nicht dazu. Und unfreie Fonts gehören erst recht nicht dazu. Wenn der Font also bei Dir nicht im TEXMF-Baum der TeX-Distribution liegt, dann ist das schon ein sehr deutlicher Hinweis, dass min. eine legal kostenlose Quelle für den Font anzugeben wäre. Oder man verwendet eben einen freien Font, wie sie auch in »The Comprehensive LaTeX Symbol List« zu finden sind.

Der Übersicht wäre es übrigens förderlich, wenn Du nicht immer nur die Frage kommentieren würdest, sondern Antworten zu den Kommentaren, die Du tatsächlich kommentieren willst, verfassen würdest. Je nach Sortierung, die man in den persönlichen Einstellungen gewählt hat, wird es sonst recht verwirrend.

Ah, wenn ich \raisebox aufspalte geht es:
\newcommand\manicule{\marginpar[{\raisebox{-4pt}{{\raggedleft{\maniculefont{☛}}}}}]{{\raisebox{-4pt}{\maniculefont{☚}}}}}
Allerdings wirkt dann \raggedleft nicht mehr. Also weiter Klammern sortieren...

Bild von Markus Kohm

TeX verwendet geschweifte Klammern sowohl für Argumente als auch für Gruppen. Wenn Du nun innerhalb der Argumentklammern weitere Klammerpaare einsetzt, dann begrenzen diese nicht mehr das Argument, sondern eine Gruppe innerhalb des Arguments. Umschaltbefehle wie \raggedleft verlieren aber am Ende der Gruppe ihre Wirkung. Gleichzeitig wird ein Absatz mit den Einstellungen gesetzt, die am Ende des Absatzes gelten. Das gilt auch für den Absatz einer Randnotiz. Daher: Geschweifte Klammern nicht wahllos setzen, sondern gezielt dort, wo sie gebraucht werden. Darüber hinaus ist eine \raisebox eine horizontale Box. Innerhalb einer horizontalen Box sind aber Absatzeinstellungen – und darum handelt es sich letztlich bei \raggedleft und \raggedright – weitgehend sinnlos bis unsinnig. Tatsächlich will man mit \raggedleft ja auch nicht die vertikale Verschiebung verändern, sondern die Randnotiz insgesamt. Also gehört die Anweisung direkt in die äußerte Ebene der Randnotiz und damit des jeweiligen Arguments von \marginpar:

\newcommand*{\manicule}{%
  \marginpar[{%
    \raggedleft
    \raisebox{-4pt}{\maniculefont}%
  }]{%
    \raggedright
    \raisebox{-4pt}{\maniculefont}%
  }%
}

Ja, die Zeilenumbrüche (einschl. der %-Zeichen) und die Einrückung habe ich absichtlich so gewählt. Die sind zwar für LaTeX unerheblich (bis auf die %-Zeichen), aber für den Autor eine echte Hilfe.

Auf die Idee, \raggedleft vor \raisebox{-4pt} zu setzen bin ich nach einigem Experimentieren auch gekommen -- allerdings fehlte mir die obige Erklärung :)
Eine letzte Frage: Warum \raggedright? Ich habe es bisher weggelassen, und das Verhalten war dasselbe.

Bild von Markus Kohm

Du willst, dass im rechten Rand linksbündig gesetzt wird. In der Voreinstellung wird im Rand aber im Blocksatz gesetzt. Bei einem einzelnen Zeichen sieht man zwar keinen Unterschied zwischen Blocksatz und linksbündigem Flattersatz, aber es ist konsequent das trotzdem explizit vorzugeben und sei es vielleicht nur, weil der nächste, der den Code übernimmt, vielleicht doch mehr als nur ein Zeichen setzen möchte. Wobei Selbstdidaktik auch kein schlechtes Argument wäre. Tatsächlich wären beispielsweise auch nicht alle der in meinem Code gezeigten % notwendig. Sich anzugewöhnen, diese an bestimmten Stellen konsequent zu setzen, ist aber im Endeffekt vorteilhaft.

Comments for "Indexe (Manicule)?" abonnieren