PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LaTex interne Wortabkürzungen im Text definieren



ubiquitin
16-03-2012, 22:37
Hallo,

Ich möchte gerne, wenn mir beim Schreiben eines Textes plötzlich ein langes Wort z.B. 4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on hinzukommt, dies an dieser Stelle mit einem Befehl definieren, sodass mir später automatisch wenn ich die definierte Abkürzung eingebe das Wort kompiliert wird, in etwa so:

In diesem Versuch wird durch eine Aldol-Reaktion 4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on \defabk{4HMM} hergestellt. Die Aldol-Reaktion ist eine wichtige Synthesemöglichkeit in der Organischen Chemie. Das Produkt \abk{4HMM} wird dabei vor allem für blablabla verwendet.

Gibt es da eine passende Möglichkeit?

Lg Ubiquitin

André25
16-03-2012, 23:52
Hallo!

Du kannst (theoretisch egal wo, aber am besten in der Präambel) einen neuen Befehl definieren:

\newcommand{\abk4HMM}{4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on}

Und dieses Kommando dann dann später im Text verwenden:

Text \abk4HMM\ Text

Der zweite Backslash ist für das Leerzeichen nach Deiner "Abkürzung" (die ja dann ausgeschrieben ist).


Beste Grüße,

André :)

Xenara
17-03-2012, 13:39
Um den zweiten Backslash zu vermeiden, kann man auch das Paket xspace und den gleichnamigen Befehl verwenden. So wird im Fliesstext ein Leerzeichen dahinter eingefügt, nicht aber vor einem Komma oder Punkt.



\usepackage{xspace}
\newcommand{\4hmm}{4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on\xspace}
...
\4hmm

(Ich verwende gerne Kleinbuchstaben für solche Abkürzungen, das schreibt sich schneller.)

André25
17-03-2012, 14:15
Insofern kann man den Backslash natürlich auch in die Definition nehmen (und erspart sich das Einbinden eines weiteren Paketes):

\newcommand{\abk}{4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on\ }

Achtung: mit Leerzeichen zwischen Backslash und schließender geschweifter Klammer.

Allerdings lässt mein Editor keine Zahl im neuen Kommando zu: \abk4HMM oder \4hmm geht also nicht.

André :)

rais
17-03-2012, 14:33
Moin moin,

Insofern kann man den Backslash natürlich auch in die Definition nehmen (und erspart sich das Einbinden eines weiteren Paketes):

\newcommand{\abk}{4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on\ }

Achtung: mit Leerzeichen zwischen Backslash und schließender geschweifter Klammer.

dann darf aber kein Interpunktionszeichen auf Deinen \abk folgen.


Allerdings lässt mein Editor keine Zahl im neuen Kommando zu: \abk4HMM oder \4hmm geht also nicht.

Generell werden Makronamen aus Buchstaben (was TeX darunter versteht) gebildet, es sei denn, auf den \ folgt nur ein einzelnes Zeichen (da sind dann fast alle Zeichen möglich).
Umschiffen könnte man das mit \csname ... \endcsname bzw. \@namedef/\@nameuse:


\documentclass{article}
\makeatletter
\newcommand*\abk[1]{%
\@nameuse{#1}%
}
\newcommand*\defabk[2]{%
\@namedef{#1}{#2}%
}
\makeatother
\defabk{4hmm}{4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on}
\begin{document}
\abk{4hmm}
\end{document}

MfG

mechanicus
17-03-2012, 14:49
Hi,

du kannst auch auf expl3 und xparse zurückgreifen. Neben der gebene Sicherheit, dass keine Anweisung überschrieben wird, erlaubt expl3 eine leichte Erweiterung.

Beispielsweise habe ich im Beispiel eine Sternvariante hinzugefügt und eine Möglichkeit undefinierte Abkürzungen im Text als solche zu deklarieren.


\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\prop_new:N \g_abk_store_prog
\NewDocumentCommand \defabk { s m m }
{
\prop_gput:Nnn \g_abk_store_prog { #2 } { #3 }
\IfBooleanT { #1 } { #3 }
}

\NewDocumentCommand \abk { s m }
{
\prop_get:NnNTF \g_abk_store_prog { #2 } \l_tmpa_tl
{ \l_tmpa_tl
\IfBooleanT { #1 } {~(#2)}
}
{[{\color{red} Unknown~Abk}]}
}
\ExplSyntaxOff

\begin{document}
\defabk{4hmm}{4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on}

\abk*{4hmm}

\abk{4hmm}

\abk{asdsadsadsad}

\defabk*{H2O2}{Wasserstoffperoxid}

\abk{H2O2}
\end{document}

EDIT: Beispiel ergänzt um eine Sternvariante von defabk.

ubiquitin
18-03-2012, 19:19
Hi,

Danke vielmals für die tollen Vorschläge. Ich fühle mich gerade etwas "doof": die meisten Vorschläge funktionieren bei mir nämlich nicht. Ich schreibe auch noch die Codes hinein für alle, die genau nach diesem Thread gesucht haben.

Beitrag2:


\documentclass{article}
\newcommand{\abk4HMM}{4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on}
\begin{document}
Es gibt \abk4HMM\ . Nebst \abk4HMM\ gibt es noch zahlreiche andere Stoffe.
\end{document}


Das Ergebnis sieht bei mir dann so aus:
"4HMM4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on Es gibt 4HMM . Nebst
4HMM gibt es noch zahlreiche andere Stoffe."
Merkwürdigerweise erscheint die ausgeschriebene Abkürzung nur beim ersten Mal, zudem wird auch die Abkürzungsdefinition ausgeschrieben.

Beitrag3:


\documentclass{article}
\usepackage{xspace}
\begin{document}
\newcommand{\4hmm}{4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on\xspace}
...
\4hmm
\end{document}


Das Ergebnis sieht bei mir dann so aus:
hmm4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on ... hmm

Beitrag4:
(funktioniert mit etwas Gewöhnung recht gut)

\documentclass{article}
\usepackage{xspace}
\begin{document}
\newcommand{\abk}{4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on}
Es gibt \abk. Nebst \abk\ wird auch ... verwendet.
\end{document}

Das Ergebnis sieht bei mir dann so aus:
Es gibt 4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on. Nebst 4-Hydroxy-1-
mesityl-4-methylpent-1-en-3-on wird auch ... verwendet.

nach \abk folgt direkt ohne Abstand das Interpunktionszeichen. Wird hingegen ein Leerzeichen nach der Abkürzung benötigt, so ist ein \ nach \abk erforderlich.

Beitrag 5(rais):

Diese Variante funktioniert ohne Probleme und scheint auch sehr einfach in ihrer Handhabung zu sein. (Für was steht hier abk[1] bzw. abk[2]?)



\documentclass{article}
\makeatletter
\newcommand*\abk[1]{%
\@nameuse{#1}%
}
\newcommand*\defabk[2]{%
\@namedef{#1}{#2}%
}
\makeatother
\defabk{4hmm}{4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on}
\begin{document}
Folgender Stoff gibt es wirklich: \abk{4hmm}. Nebst \abk{4hmm} werden auch andere Chemikalien oft verwendet. \abk{4hmm} ist hier vermutlich die beste Wahl.
\end{document}

Das Ergebnis sieht bei mir dann so aus:
Folgender Stoff gibt es wirklich: 4-Hydroxy-1-mesityl-4-methylpent-1-en-
3-on. Nebst 4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on werden auch andere Chemikalien oft verwendet. 4-Hydroxy-1-mesityl-4-methylpent-1-en-3-on ist hier vermutlich die beste Wahl.

Beitrag 6:

Leider erschien bei mir da die Fehlermeldung:
Erzeuge Projekt: abkuerzunga
--------------------------------------------------
abkuerzunga.tex(1): Fehler: LaTeX Error: File `xparse.sty' not found.
abkuerzunga.tex(3): Fehler: Emergency stop.
abkuerzunga.tex(1): Fehler: ==> Fatal error occurred, no output PDF file produced!
--------------------------------------------------
abkuerzunga - 3 Fehler, 0 Warnung(en), 0 Overfull Box(en), 0 Underfull Box(en)

In MikTex Packet Manager habe ich das Paket xparse.sty leider nicht gefunden.

--------------------------------
--------------------------------

Herzlichen Dank für eure wertvollen Tipps! Ich war echt beeindruckt, wie viel Input in solch kurzer Zeit entstand ((Bin noch ein Neuling)) :)

Lg ubiquitin

mechanicus
18-03-2012, 19:31
Hi,

welche Version von MikTeX hast du?

Die Lösungen 1+2 sind nicht möglich. Die Gründe findest du im Beitrag von Rainer.

Marco

rais
19-03-2012, 18:43
Moin moin,

(Für was steht hier abk[1] bzw. abk[2]?)



\newcommand*\abk[1]{%
\@nameuse{#1}%
}

heißt etwa: `Erstelle einen neuen Befehl \abk. Dieser \abk soll ein Argument verarbeiten.' In dem folgenden Klammerpaar steht dann die Definition, wobei #1 für `Parameter Nr. 1' steht.
BTW: \@namedef und \@nameuse sind im LaTeX-Kern definiert.


abkuerzunga.tex(1): Fehler: LaTeX Error: File `xparse.sty' not found.

Schau in Deinem Paketmanager nach `l3packages', da gehört xparse.sty dazu, AFAICS.

MfG