Hey Leute, Nachdem ich schon lange Suche und meinem Ziel auch schon sehr nahe bin haperts an der letzten Stelle, beim Anwenden von makeindex:-) Mein Ziel ist es, in einem Dokument teile der Seiten sozusagen dazwischen geschoben aufzunehmen. Eine Seitennummerierung im Dokument könnte dann für 4 Seiten zB so aussehen: 2 2a 2b 3

Das klappt auch soweit wunderbar, nur wenn ich dann makeindex Aufrufe ignoriert das meine manipulierten Seiten (die anderen werden korrekt übernommen). Die entscheidende Fehlermeldung lautet:

Open in Online-Editor
scanning input file in.idx....done (354 entries accepted, 13 rejected).

Mein Code zur Erstellung der veränderten Nummerierungen lautet:

Open in Online-Editor
\newcounter{savepage}
\newcommand{\initBetweens}{
    \setcounter{savepage}{\value{page}}
    \addtocounter{savepage}{1}
    \setcounter{page}{1}
    \renewcommand{\thepage}{\arabic{savepage}\alph{page}}
    \newpage
}

\newcommand{\exitBetweens}{
    \stepcounter{savepage}
    \setcounter{page}{\value{savepage}}
    \renewcommand{\thepage}{
        \arabic{page}
    }
}

Ich füge alle Seiten mit include hinzu und wenn ich eine geänderte Nummerierung wünsche, packe ich das Zwischen den init und exit Befehl.

Hat jemand eine Idee, wie ich diese Nummerierung von makeindex akzeptiert bekomme?

Viele Grüße, SiMoeBoe

gefragt 21 Jul '13, 12:22

SiMoeBoe's gravatar image

SiMoeBoe
51114
Akzeptiert-Rate: 100%

bearbeitet 18 Jun '15, 17:40

saputello's gravatar image

saputello
11.1k174365

Es wäre übrigens schön, wenn Du Deinen Fragen in der Regel ein VM beifügen würdest und nicht nur einen Codeschnippsel. Dann hätte man etwas zum Testen in der Hand und müsste sich nicht erst selbst etwas aus den Fingern saugen, das dann am Ende möglicherweise gar nicht passt.

(22 Jul '13, 11:59) saputello

Soo, nach langem Suchen habe ich nun endlich doch die Lösung gefunden. In \thepage ist die Kombination von Zahlen und Buchstaben nicht ohne weiteres erlaubt. Man muss ein spezielles Trennzeichen (bei mir default - ) nutzen, damit makeindex das ganze richtig interpretiert. In einer eigenen .ist Style Datei kann man dieses Trennzeichen mit z.B.

page_compositor "/"
delim_r "/"

ändern. Allerdings ist hier kein Leerzeichen oder gar kein Trennzeichen erlaubt.

Vielleicht hilft es ja noch dem ein oder anderen;-) Viele Grüße, SiMoeBoe

Permanenter link

beantwortet 21 Jul '13, 16:52

SiMoeBoe's gravatar image

SiMoeBoe
51114
Akzeptiert-Rate: 100%

bearbeitet 21 Jul '13, 18:38

cgnieder's gravatar image

cgnieder
22.1k253463

Das funktioniert so nach meinen Infos aber nur bedingt. Da makeindex in der Voreinstellung zuerst auf kleine römische Zahlen, dann auf arabische Zahlen, dann auf Kleinbuchstaben, dann auf große römische Zahlen, dann auf Großbuchstaben testet, könnten c, i, v, m, d und x eventuell falsch sortiert werden. Um das zu ändern, brauchst Du noch ein page_precedence "narRA", wodurch die Reihenfolge verändert wird. Siehe u. a. dazu meine Antwort.

(22 Jul '13, 08:52) saputello

Aufwändige Lösung mit MakeIndex

makeindex kann zwar bei den Seitenzahlen mit arabischen Zahlen, kleinen und großen römischen Zahlen und Klein- und Großbuchstaben umgehen, erwartet allerdings, dass bei Kombinationen davon ein Trennzeichen zwischen den unterschiedlichen Zahlenteilen steht. Dieses Trennzeichen kann im MakeIndex-Stil über die Variable page_compositer eingestellt werden. Es sind alle Zeichen außer dem NUL-Zeichen erlaubt. Zeichen, die gleichzeitig als Ziffern verwendet werden können, sollten allerdings besser nicht verwendet werden.

Um zu erkennen, ob ein Zeichen Teil einer Zahl ist waren in früheren Versionen von makeindex eine feste Reihenfolge eingestellt. Dabei wurden zunächst arabische Ziffern dann alle einzelnen Kleinbuchstaben erkannt. Bei mehreren Kleinbuchstaben wurde hingegen geprüft, ob beispielsweise mehrere i aufeinander folgen oder auf das i eine andere kleine römische Ziffer folgte. In dem Fall wurde auf eine römische Zahl erkannt. Dann fand für Großbuchstaben ein ähnlicher Test statt. Problematisch war dabei, dass einzelne römische Ziffern als Buchstaben erkannt und deshalb ggf. falsch einsortiert wurden. Seit einigen Versionen (AFAIK min. 2.12) wird die Reihenfolge, in der die Zahlen geprüft werden, jedoch über die Variable page_precedence erkannt. Der dort angegebene String gibt die Erkennungsreihenfolge an:

r – kleine römische Zahl
n – arabische Zahl
a – Kleinbuchstabe
R – große römische Zahl
A – Großbuchstabe

Die oben angegebene Reihenfolge ist gleichzeitig die normale Such-/Testreihenfolge.

Du hast also zwei Probleme.

  1. Da zwischen arabischer Zahl und Kleinbuchstabe bei Dir kein Trennzeichen steht, erkennt MakeIndex keine Zahlengruppen, sondern meldet falsche Zeichen in der Seitenzahl.
  2. Da MakeIndex in der Voreinstellung zuerst kleine römische Zahlen und dann Kleinbuchstaben erkennt, werden c, d, i, m und x eventuell falsch einsortiert.

Das zweite Problem ist einfach mit

page_precedence "narAR"

in der MakeIndex-Stildatei zu lösen.

Da es nicht möglich ist, bei page_compositor nichts anzugeben. Ist das erste Problem nur sehr umständlich zu lösen. Dazu muss man die Seitenzahlen mit einem Trennzeichen versehen, aber dafür sorgen, dass LaTeX dieses Trennzeichen nicht mit anzeigt.

% Zuerst `\jobname.mst` erzeugen. Diese wird von makeindex automatisch verwendet.
\begin{filecontents*}{\jobname.mst}
page_precedence "narAR"
page_compositor "."
\end{filecontents*}
\documentclass{article}
\usepackage{scrbase}
\usepackage{scrpage2}
\usepackage{lipsum}
\usepackage{makeidx}\makeindex
\makeatletter
% Der Befehl `\pagewithsuffix` schaltet auf die eingeschobenen Seiten um.
% Er definiert gleichzeitig `\endpagewithsuffix`, das dann wieder zurück
% schaltet.
\newcommand*{\pagewithsuffix}{%
  \clearpage
  \edef\endpagewithsuffix{\noexpand\clearpage
    \noexpand\setcounter{page}{\the\value{page}}%
    \noexpand\stepcounter{page}}%
  \expandafter\l@addto@macro\expandafter\endpagewithsuffix\expandafter{%
    \expandafter\def\expandafter\thepage\expandafter{\thepage}%
  }%
  \edef\thepage{\thepage.\noexpand\alph{page}}%
  \setcounter{page}{1}%
}
% Mit `\specialpageformat` werden die Punkte in den Seitenzahlen
% für die Ausgabe entfernt. Es ist zu beachten, dass dies für
% alle Seitenzahlen anzuwenden ist! Das ganze funktioniert nur,
% solange nicht zwei unmittelbar aufeinanderfolgende Punkte in
% den Seitenzahlen auftreten können. Eine alternative Implementierung
% mit Hilfe des `xstrings`-Pakets wäre eventuell sinnvoll und möglich
\newcommand*{\specialpageformat}[1]{%
  \begingroup
    \edef\reserved@a{#1}%
    \expandafter\@specialpageformat\reserved@a..%
  \endgroup
}
\newcommand*{\@specialpageformat}{}
\def\@specialpageformat#1.#2{%
  #1\ifx #2.\else #2\expandafter\@specialpageformat\fi
}
% Es wird scrpage2 für den Seitenstil verwendet, damit die Ausgabe
% der Seitenzahlen bei der Nummerierung der Seiten ebenfalls
% `\specialpageformat` verwenden kann. Eine Lösung mit fancyhdr
% wäre natürlich alternativ möglich.
\renewcommand*{\pagemark}{%
  \specialpageformat{\thepage}%
}
\pagestyle{scrplain}
\makeatother

% Die folgende Anweisung dient nur meinem persönlichen Komfort.
\newcommand*\lipsumpages{%
  \lipsum[1]\index{Eintrag|specialpageformat}
  \lipsum[2-5]\index{Eintrag|specialpageformat}
  \lipsum[6-10]\index{Eintrag|specialpageformat}
}

\begin{document}
\lipsumpages
\pagewithsuffix
\lipsumpages\lipsumpages
\endpagewithsuffix
\printindex
\end{document}

Kommt dann noch hyperref hinzu, so wird die Lösung schnell unübersichtlich und schwer beherrschbar. Daher sei stattdessen ausdrücklich xindy an Stelle von makeindex empfohlen.

Einfache Lösung mit Xindy:

xindy ist makeindex in vielerlei Hinsicht deutlich überlegen.

Bereits das folgende einfache Beispiel zeigt, wie man den neuen Nummerierungsstil, der aus arabischen Zahlen, denen unmittelbar ein Kleinbuchstabe folgt, definieren kann:

% Es wird ein neues xindy-Modul angelegt, das die neue Nummerierungsart für
% Seiten bereitstellt.
\begin{filecontents*}{arabicalpha.xdy}
(define-location-class "arabic-pages" ("arabic-numbers"))
(define-location-class "arabicalpha-pages" ("arabic-numbers" "alpha"))
(define-location-class-order ("arabic-pages" "arabicalpha-pages"))
\end{filecontents*}

\documentclass{article}
\usepackage{scrbase}% für \l@addto@macro
\usepackage{lipsum}
\usepackage{makeidx}\makeindex

\makeatletter
% Der Befehl `\pagewithsuffix` schaltet auf die eingeschobenen Seiten um.
% Er definiert gleichzeitig `\endpagewithsuffix`, das dann wieder zurück
% schaltet.
\newcommand*{\pagewithsuffix}{%
  \clearpage
  \edef\endpagewithsuffix{\noexpand\clearpage
    \noexpand\setcounter{page}{\the\value{page}}%
    \noexpand\stepcounter{page}}%
  \expandafter\l@addto@macro\expandafter\endpagewithsuffix\expandafter{%
    \expandafter\def\expandafter\thepage\expandafter{\thepage}%
  }%
  \edef\thepage{\thepage\noexpand\alph{page}}%
  \setcounter{page}{1}%
}
\makeatother

% Die folgende Anweisung dient nur meinem persönlichen Komfort.
\newcommand*\lipsumpages{%
  \lipsum[1]\index{Eintrag}
  \lipsum[2-5]\index{Eintrag}
  \lipsum[6-10]\index{Eintrag}
}

\begin{document}
\lipsumpages
\pagewithsuffix
\lipsumpages\lipsumpages
\endpagewithsuffix
\printindex
\end{document}

Nach dem ersten LaTeX-Lauf kann man in diesem einfachen Fall xindy über den MakeIndex-Kompatibilitäts-Wrapper texindy wie folgt aufrufen:

texindy -M arabicalpha.xdy <DATEINAME>

wobei <DATEINAME> der Name der idx-Datei ist. Dabei ist xindy sogar in der Lage, die aufeinanderfolgenden Seiten 3a bis 3d korrekt zusammenzufassen:

alt text

Wie man sieht, lohnt es sich, über einen Umstieg auf xindy nachzudenken.

Permanenter link

beantwortet 22 Jul '13, 09:45

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 22 Jul '13, 10:58

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:

×25
×16
×16

gestellte Frage: 21 Jul '13, 12:22

Frage wurde gesehen: 12,046 Mal

zuletzt geändert: 18 Jun '15, 17:40