PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ein Befehl -> Counter setzen und Akronym erstellen



FlorianKiel
09-10-2008, 08:13
Hallo allerseits,
ich bin neu hier und habe gleich mal eine Zielsetzung, die ich alleine nicht erreiche.
Folgendes ist das Ziel:
Ich definiere an einer Stelle im Text ein Objekt mit einem kurzen Namen und einem langen Namen. Dabei soll zeitgleich ein Zähler weitergesetzt werden, sodass ich an beliebiger anderer Stelle unter Verwendung des kurzen Namens den langen Namen bzw. den zugehörigen Counter ausgegeben bekomme.
Ich habe es bisher geschafft, ein Objekt mit einem kurzen Namen zu definieren und diesen mit einem Counter zu versehen. Mir wurde an anderer Stelle das Paket "acronym" ans Herz gelegt, welches die Möglichkeit bietet, unter Verwendung des kurzen Namens den langen ausgegeben zu bekommen. Ich bin allerdings nicht in der Lage diese beiden Dinge miteinander zu Verknüpfen, sodass sie so funktionieren wie ich das gerne hätte.
Ich würde mich sehr über Ideen oder fertige Lösungen freuen,
vielen Dank schonmal,

Florian

cookie170
09-10-2008, 11:11
Hallo Florian,

willkommen im Forum. Nach Deiner Beschreibung kann ich mir noch nicht vorstellen, was Du vorhast. Kurzer Name, langer Name, Zähler -- wozu? Willst Du Acronyme durchnummerieren?

Gruß,
Alexander

FlorianKiel
09-10-2008, 12:28
Hallo Alexander!
Vielen Dank erstmal für deine Bereitschaft zur Hilfe.

Meine Situation ist die folgende:
Ich muss in meinen Chemie-Protokollen sämtliche im Text und in Abbildungen erscheinenden Verbindungen nummerieren. Außerdem muss ich sie im Text beim korrekten Namen nennen und Stellenweise die dazugehörige Nummer referenzieren. Ich möchte mir ganz einfach, nachdem ich die Verbindung an der Stelle ersten Auftretens definiert habe, nur unter Verwendung eines Kurznamens (den ich mir merken kann, der keine 5min tipparbeit ist) Zugriff auf den korrekten Namen und die zugehörige Nummer haben.
Für die Nummer habe ich halt schon die Teillösung, die sieht so aus:

\newcounter{verbindungen}
\newcommand{\Verb}[1]{\refstepcounter{verbindungen}\label{#1}}
\newcommand{\vref}[1]{{\bf \ref{#1}}}
dann kann ich an beliebiger Stelle im Text schreiben

\Verb{mein_Kurzname}
und der Verbindung wird ihre Nummer zugewiesen, die ich dann per

\vref{mein_Kurzname}
ausgeben lassen kann. Nur möchte ich halt gerne in ein und demselben Befehl zur Definition der Verbindung auch einen langen Namen deklarieren können, den ich analog zur Nummer ausgegeben bekomme.
Ist diese Beschreibung besser?

Gruß, Florian

sommerfee
09-10-2008, 12:50
\refstepcounter erhöht ja nicht nur den Zähler, sondern setzt auch \@currentlabel. Mit \label wird eine Verbindung zwischen dem Labelnamen und \@currentlabel hergestellt, indem beides in die aux-Datei geschrieben wird.

Du kannst aber in deinen Makros auch \@currentlabel als "Käsekuchen" definieren, das passende \ref{<name>} würde dann keine Nummer(nkombination) liefern, sondern eben "Käsekuchen".

(Um \@currentlabel umdefinieren zu können, muß die passende Makrodefinition mit \makeatletter und \makeatother geklammert werden.)

Wenn du "Käsekuchen" nicht als Ersatz für die Nummer definieren möchtest, sondern zusätzlich Zugriff darauf haben möchtest, so könnte man das mit Hilfe des zref-Paketes (Richtiger Paketname? Ich meine das aus dem oberdiek-Paketbundle) bewerkstelligen.

Gruß,
Axel

cookie170
09-10-2008, 13:33
Ich muss in meinen Chemie-Protokollen sämtliche im Text und in Abbildungen erscheinenden Verbindungen nummerieren.

Wie willst Du Verbindungen in Abbildungen nummerieren? Erstellst Du die Abbildungen selbst mit irgendeinem TeX-Format (Tikz oder so?)?

Wie dem auch sein, Du bist nicht der erste Chemiker mit diesem Problem und es gibt dazu mehrere Pakete, z.B. chemcompounds und chemcono. Du findest näheres beispielsweise im thematischen Katalog der LaTeX-Pakete hier. (http://texcatalogue.sarovar.org/bytopic.html)



Außerdem muss ich sie im Text beim korrekten Namen nennen

Alternative Namen scheinen auch eine Chemiker-Spezialität zu sein, geht der Beschreibung nach wohl auch mit den o.g. Paketen. Du erhälst, wenn diese Pakete einmal installiert sind, die Anleitung übrigens mit


texdoc Paketname auf der Konsole.

Wenn Dir das jetzt nicht hinreichend weiterhilft, dann wird es für Deine Leser hier leichter mit einem Minimalbeispiel.

Was Axel da oben vorgeschlagen hat geht leider über meinen Horizont.

Gruß,
Alexander

FlorianKiel
09-10-2008, 21:05
*FIXED*
So, nach etwa 5stündiger Einarbeitung in Latex-Makros und das zref-Paket im speziellen (vielen Dank für den Hinweis, Axel!) ist es mir nun gelungen das Problem nach meinen Wünschen zu lösen. Vielen Dank auch an Alexander für den Hinweis auf die bereits vorhandenen Paktete, daran hatte ich gar nicht gedacht, dass sowas evtl. schon fertig verfügbar sein könnte.
Hier meine Lösung:


\usepackage[user]{zref}

\makeatletter

\newcounter{verbnr}

\zref@newprop*{vname}{}
\zref@newprop*{vnr}{}
\zref@addprop{main}{vname}
\zref@addprop{main}{vnr}

\def\Verbindung#1#2{%
\stepcounter{verbnr}%
\zref@setcurrent{vname}{#2}%
\zref@setcurrent{vnr}{\textbf{\arabic{verbnr}}}%
\zref@wrapper@immediate{\zref@label{verb:#1}}%
}
\def\getname#1{%
\zref@extract{verb:#1}{vname}
}

\def\getnr#1{%
\zref@extract{verb:#1}{vnr}
}


\makeatother

Damit kann ich an beliebiger Stelle im Text sagen


\Verbindung{v1}{sehr langer Verbindungsname}

An beliebiger anderer Stelle verschafft


\getname{v1}
\getnr{v1}

mir den gewünschten langen Namen bzw die gewünschte Nummer der Verbindung.

Also dann, nochmal Danke für die Hilfe,
Gruß,
Florian

P.S.:Alexander, die Nummerierung in Abbildungen erreiche ich bei Verwendung von .eps-Grafiken mit dem Paket psfrag. Ich kann damit beliebige Textausschnitte in der .eps-Grafik ersetzen durch beliebigen Latex-Text (geht z.B. auch mit Formeln etc, wird alles in der in Latex gewählten Schriftart usw. dargestellt).

sommerfee
09-10-2008, 21:23
Was Axel da oben vorgeschlagen hat geht leider über meinen Horizont.

Vielleicht hilft ein kleines Beispiel:



\documentclass{article}

\makeatletter
\newcommand*\meinbefehl[1]{\renewcommand\@currentlabel{#1}}
\makeatother

\begin{document}

\ref{label1} \ref{label2}

\meinbefehl{Kaesekuchen!}\label{label2}

\meinbefehl{Ich mag}\label{label1}

\end{document}


Wenn man \@currentlabel und \ref allerdings derart für eigene Zwecke mißbraucht, ist in Verbindung mit dem hyperref-Paket einiges zu beachten. Mit dem zref-Paket ist man daher auch bei solch einfachen eindimensionalen label-ref Beziehungen auf der sichereren Seite.

Liebe Grüße,
Axel

sommerfee
09-10-2008, 21:51
Noch ein kleiner Verbesserungsvorschlag:



\def\getname#1{%
\zref@extract{verb:#1}{vname}%
}

\def\getnr#1{%
\zref@extract{verb:#1}{vnr}%
}


Ohne die zusätzlichen % erzeugen \getname und \getnr zusätzlich ein Leerzeichen, welches sich u.U. störend auswirken könnte.

Liebe Grüße,
Axel

FlorianKiel
10-10-2008, 13:07
Ist eingebaut, danke für den hinweis...