In Anschluss an die Frage http://texwelt.de/wissen/fragen/3715/wie-kann-ich-worter-im-text-automatisch-formatieren-lassen habe ich xesearch ausprobiert, um typische bibliographische Angaben automatisch richtig spationieren zu lassen.

xesearch scheint laut Fehlermeldung keine Punkte zu akzeptieren (im Handbuch nichts dazu gefunden), nur damit würde aber ein "normaler" Text automatisch formatiert. Weiß jemand eine Lösung?

Hier mein Beispiel:

Open in Online-Editor
\documentclass[11pt]{article}
\usepackage[ngerman]{babel}
\usepackage{xltxtra,libertine,xesearch,xspace}

\newcommand{\spat}{\kern .12em}
\newcommand{\bd}{Bd.\spat}
\newcommand{\ff}{\spat{}ff.\xspace}
\newcommand{\pag}{S.\spat}

\SearchList{bd}{\bd}{Bd.}
\SearchList{ff}{\ff}{ff.}
\SearchList{S}{\pag}{S.}

\begin{document}
Text (vgl. Werke \bd 1, \pag 12\ff) %Formatierung: Spationierung über \newcommand

Text (vgl. Werke Bd. 1, S. 12 ff.)   %Autoformatierung über xesearch
\end{document}

Nach der Beantwortung von Clemens hier ein vervollständigtes, funktionsfähiges Beispiel:

Open in Online-Editor
% arara: xelatex
\documentclass[11pt]{article}
\usepackage[ngerman]{babel}
\usepackage[osf]{libertine}
\usepackage{xltxtra,xesearch,xspace}
\newcommand*{\spat}{\kern.10em\relax}
\UndoBoundary{.}
\begin{document}

\quad\textsf{Ohne Spationierung}

Text (vgl. Werke Bd. 1, a. a. O., S. 12 ff.)

V. 12, S. 45 f., pp. 45 sqq., H. 23, vol. 19, no. 3

\medskip

\quad\textsf{Mit automatischer Spationierung}

% Autoformatierung über xesearch -- 
\SearchList*!{all}{\spat\ignorespaces}{Bd.,p.,pp.,Kap.,V.,S.,cap.,chap.,vol.,Nr.,no.,H.,cf.}
\SearchList*{ff}{\unskip\spat#1}{ff.,f.,sq.,sqq.}
\SearchList*{aao}{a.\spat a.\spat O.}{a.a.O.,a. a. O.}
\SearchList*{Aao}{A.\spat a.\spat O.}{A.a.O.,A. a. O.}
\SearchList*{oc}{op.\spat cit.}{op.cit,op. cit.}
\SearchList*{Oc}{Op.\spat cit.}{Op.cit.,Op. cit.}
\SearchList*{zb}{z.\spat B.}{z.B.,z. B.}

Text (vgl. Werke Bd. 1, a. a. O., S. 12 ff.)

V. 12, S. 45 f., pp. 45 sqq., H. 23, vol. 19, no. 3
\end{document}

alt text

gefragt 08 Mär '14, 13:59

kai's gravatar image

kai
5483914
Akzeptiert-Rate: 33%

bearbeitet 14 Apr '15, 17:41

saputello's gravatar image

saputello
11.1k154365


Manchmal lohnt es sich, die log-Datei aufmerksam zu lesen. Dein Code liefert die Fehlermeldung

Open in writeLaTeX
! Package xesearch Error: You can't use `.' in `Bd.',
(xesearch)                it's already a string delimiter.
(xesearch)                `Bd.' won't be searched .

Mein erster Gedanke war: „vielleicht hat das Paket ja Möglichkeiten zur Anpassung“ und in der Tat:

So when does [XeSearch] stop searching? There are two main cases:

  1. It encounters a space, or any primitive control sequence. The former case is quite natural: you want spaces to delimit words (including \skips and associates). But the latter is less obvious: as soon as TeX does something that is not typesetting letters, XeSearch gives up. And this includes something as seemingly innocuous as a \relax [...]. That’s the reason why, for instance, XeSearch will never find TeX in \TeX: the definition contains many operations that aren’t strictly speaking putting letters in the stream. Fortunately, the bulk of a manuscript is made of letters and spaces, and one seldom inserts \relaxes in the middle of words.
  2. XeSearch encounters a character that you’ve declared as a non-letter, that is a word boundary. This leads us to the following macro:

    Open in writeLaTeX
    \MakeBoundary{⟨characters⟩}
    \UndoBoundary{⟨characters⟩}
    

The basic set of such characters is as follows

Open in writeLaTeX
.,;:!?-`'()[]{}

Wenn man \UndoBoundary{.} zu Deinem Beispiel hinzufügt, geht es denn auch:

Open in writeLaTeX
% arara: xelatex
\documentclass[11pt]{article}
\usepackage[ngerman]{babel}
\usepackage{xltxtra,libertine,xesearch,xspace}

\newcommand{\spat}{\kern .12em}
\newcommand{\bd}{Bd.\spat}
\newcommand{\ff}{\spat{}ff.\xspace}
\newcommand{\pag}{S.\spat}

\UndoBoundary{.}
\SearchList{bd}{\bd}{Bd.}
\SearchList{ff}{\ff}{ff.}
\SearchList{S}{\pag}{S.}

\begin{document}
Text (vgl. Werke \bd 1, \pag 12\ff) % Formatierung: Spationierung über \newcommand

Text (vgl. Werke Bd. 1, S. 12 ff.)  % Autoformatierung über xesearch
\end{document}

Die beiden Zeilen sehen trotzdem nicht identisch aus, aber das liegt daran, dass die Leerzeichen nach \bd und \pag ignoriert werden also effektiv nicht da sind, während die Leerzeichen nach Bd. und S. nicht ignoiert werden und daher auch im Output landen. Durch geeignete Definitionen der Suchlisten lässte sich das aber korrigieren:

Open in writeLaTeX
% arara: xelatex
\documentclass[11pt]{article}
\usepackage[ngerman]{babel}
\usepackage{xltxtra,libertine,xesearch,xspace}

\newcommand*{\spat}{\kern.12em\relax}

\UndoBoundary{.}

\begin{document}

% Formatierung: Spationierung über Befehle:
\newcommand*{\bd}{Bd.\spat}
\newcommand*{\ff}{\spat ff.}
\newcommand*{\pag}{S.\spat}
Text (vgl. Werke \bd 1, \pag 12\ff)

% Autoformatierung über xesearch -- 
% Listen im Beispiel erst hier, damit vorher inm vorigen Beispiel keine
% Doppel-Anwendung stattfindet und den Vergleich unmöglich macht:
\SearchList*!{bd}{\spat\ignorespaces}{Bd.}
\SearchList*{ff}{\unskip\spat#1}{ff.}
\SearchList*!{S}{\spat\ignorespaces}{S.}

Text (vgl. Werke Bd. 1, S. 12 ff.)

\end{document}

alt text

Ein bisschen Erklärung:

Open in writeLaTeX
\SearchList{<Name>}{<ersetze>}{<Liste von Suchbegriffen>}

\SearchList sucht und ersetzt normalerweise unabhängig von Groß- und Kleinschreibung (case-insensitive). Bei \SearchList* wird Groß- und Kleinschreibung beachtet (case-sensitive).

Normalerweise gilt außerddem tatsächlich Suchen und Ersetzen. Möchte man nicht, dass ersetz wird, sondern formatiert, kann man den gefundenen Teil im <ersetze> mit #1 wieder einfügen:

Open in writeLaTeX
\SearchList{fett}{\textbf{#1}}{ich,bin,fett}

Bei der Version mit Ausrufezeichen wird das gefundene allerdings nicht ersetzt, sondern der <ersetze>-Teil danach eingefügt.

Das Makro \ignorespaces sorgt dafür, dass folgende Leerzeichen ignoriert werden. Dadurch kann das im Quelltext vorhandene Leerzeichen nach Bd. und S. ignoriert werden, sonst würde es hier zusätzlich zum mit \spat eingefügten Leerraum verwendet.

\unskip entfernet den zuletzt eingefügten Leerraum (sei er horizontal, vertikal, ...). Das wird hier verwendet, um das Leerzeichen, das im Quelltext vor ff. vorhanden ist, wieder zu entfernen. Sonst würde es hier zusätzlich zum mit \spat eingefügten Leerraum verwendet.

Permanenter link

beantwortet 09 Mär '14, 15:40

cgnieder's gravatar image

cgnieder
22.1k243463
Akzeptiert-Rate: 60%

bearbeitet 10 Mär '14, 11:11

Spitze, ich bedanke mich für die aufwändige souveräne Antwort! Sicher eine blöde Frage: Wie verändert sich denn SearchList mit Asterisk bzw. mit Ausrufezeichen? Für ignorespaces habe ich zur Erläuterung http://tex.stackexchange.com/questions/124098/ignore-space-in-defining-environment gefunden, für newcommand* diese Antwort: http://tex.stackexchange.com/questions/1050/whats-the-difference-between-newcommand-and-newcommand

(09 Mär '14, 20:38) kai

@kai das wird beides im xesearch Manual erklärt (ich hab's entdeckt, als ich nach einer Lösung für den Punkt gesucht habe): normalerweise ist eine Suchliste case insensitive, missachtet also Groß- und Kleinschreibung: mit dem Stern * wird sie beachtet. Normalerweise ersetzt eine Suchliste außerdem das gefundene mit dem im zweiten Argument spezifizierten Ersetzungstext (dort kann #1 verwendet werden, um das ersetzte wieder einzufügen). Mit Ausrufezeichen wird der Code stattdessen nach das gefundene gesetzt statt es zu ersetzen.

(09 Mär '14, 21:25) cgnieder
(09 Mär '14, 21:26) cgnieder

Herzlichen Dank, das werde ich mir noch in Ruhe durcharbeiten!

(09 Mär '14, 23:01) kai

@kai: ich hab noch ein paar Erklärungen zur Antwort hinzugefügt

(10 Mär '14, 11:12) cgnieder

Nochmal Danke! Das wird mir in Zukunft einiges an Formatierungsarbeit ersparen. Und nebenbei scheint es auch falsche Umbrüche -- wie S.|2 -- zu verhindern. Komisch, dass man überall nur von händischen Anpassungen mit \, oder ~ liest.

(10 Mär '14, 20:32) kai

Re »Komisch, dass man überall nur von händischen Anpassungen mit \, oder ~ liest.« Weil man mit xesearch auf XeLaTeX angewiesen ist. Ich persönlich präferiere pdfLaTeX und danach LuaLaTeX und erst am Schluß XeLaTeX (unter anderem wegen der abnehmenden microtype-Unterstützung). Und während man tippt, macht es ja keinen großen Unterschied, ob man nun ein Leerzeichen oder ~ eintippt.

(10 Mär '14, 20:38) cgnieder

Ja das sehe ich ein, wobei XeLaTeX ja seit einer Weile zumindest ein wenig microtype beherrscht (nutze ich auch). Mir ist es aber am wichtigsten wegen der verfügbaren Schriften (wobei es da ja sehr viel packages inzwischen gibt: Source Sans, Libertine, Alegreya etc.), Unicode etc.

Mein Hauptproblem mit XeLaTeX ist Handouts drucken mit Beamer. Da geh ich wenn möglich immer zu pdfLaTeX zurück.

Was ist eigentlich der Grund, dass es kein xesearch für pdfLaTeX gibt?

(11 Mär '14, 10:51) kai
Ergebnis 5 von 8 show 3 more comments
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×48
×9

gestellte Frage: 08 Mär '14, 13:59

Frage wurde gesehen: 9,561 Mal

zuletzt geändert: 14 Apr '15, 17:41