PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Umlaute als Parameter an Makro übergeben



Skunk
23-11-2004, 19:59
Hallo,

mein Problem ist: Ich versuche ein Makro zu definieren, dass mir einen Eintrag ohne Nummerierung ins Inhaltsverzeichnis schreibt und habe dafür in einem Ergänzungspaket folgende Zeile gebastelt:


\def\totoc#1{\addcontentsline{toc}{section}{\hspac e*{\lefttocspace}#1}}

Wenn ich dann im Dokument den Befehl anwenden will, funktioniert das so lange, bis ich Umlaute im Paramtertext übergebe. Der Aufruf
\totoc{Ergaenzung} läuft,
\totoc{Ergänzung} meldet den Fehler:

LaTeX Error: Command \textcurrency unavaible in encoding 0T1

Wie schaffe ich es also, Umlaute als Parameter zu übergeben?

blubb
24-11-2004, 07:47
\protect vor den Umlaut (und evtl \"a verwenden)?

Skunk
24-11-2004, 17:47
Okay, danke, das ist soweit schonmal gut, aber noch nicht ganz so elegant wie ich gehofft hatte. Wenn ich das Inputenc-Package mit option latin1 verwende kann ich ja normalerweise Umlaute direkt eingeben. Diese Umlaute werden dann von Latex auch in Überschriften z.B. mit dem "Section"-Befehl widerstandslos verarbeitet. Warum von meinem eigenen Makro nicht? Was muss ich ändern, dass ich Umlaute ohne irgendwelche Sonderbefehle, also in der gewohnten schreibweise übergeben kann?

blubb
25-11-2004, 08:17
Das liegt weniger daran, das es dein eigenes Makro ist, sondern daran, das \addcontentsline verwendet wird.

Zum Problem:
Google mal nach TeX und zerbrechlich oder schau mal http://www.dante.de/faq/de-tex-faq/html/makros3.html#79

Eine grobe Erklärung:
ä ist eigentlich eine Abkürzung für \"a, das wiederum eine Abkürzung für ein anderes Makro ist...

Verwendest du ä in einem Makro, wird es expandiert (\"a oder auch schon weiter) und von \addcontentsline in die toc-Datei geschrieben. Dort wird es wieder eingelesen und weiter expandiert.
Das Problem ist jetzt weniger das einmalige expandieren, sondern eher das expandieren, Teilergebnis wegschreiben, expandieren...

Das expandieren kann man mit \protect verhindern, das verhindern einer Expansion über zwie Stufen benötigt schon 3 \protects (eines für das Makro selbst und ein \protect um das \protect für den zweiten Durchlauf zu schützen).

Ein andere Mechanismus (von dem ich keine Ahnung habe) ist \string.

Und wenn das jetzt etwas verwirrend ist, kann es auch daran liegen, das ich mich da auch nicht sehr gut auskenne, ich schlag mich halt durch ;-)

Was vielleicht auch helfen kann:
Statt \addcontentsline mit
\protected@write\@tocout
{\string\addcontentsline{toc}{section}{\hspace*{\l efttocspace}#1}
arbeiten

(keine Ahnung ob das klappt, und ein Minimalbeispiel baue ich dir jetzt nicht.)

Und bevor ich mir weiter Gedanken mache:
Für was brauchst du dein Makro? \addsec aus den Komaklassen kennst du?
(Grundlage der Fragestellung in Foren: Frag was du willst, wie du es bisher gelöst hast und wo dein Problem ist. Vielleicht bekommst du keine Antwort zu deinem Problem, aber eine wie du dein Ziel erreichst).

lubb

Skunk
25-11-2004, 19:52
Hey, vielen Dank für diese ausführliche Antwort. Tja, was ich im Prinzip will, ist Latex-Programmierung lernen und ich habe dieses Makro eher als Experiment als aus konkretem Nutzen gebaut. Die Koma-Klassen kenne ich, \addsec habe ich noch nicht verwendet, aber werde das wohl mal nachschlagen. Dennoch ging es mir eigentlich mehr ums Verstehen. Ich schlage mich grade durch Kopka's 3. Latex-Band und Schwarz' Tex-Einführung und werde mal noch die Links aus diesem Forum abklappern...also vielen Dank soweit!
Skunk