PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Parameter innerhalb eines Befehls in Kleinschrift umwandeln



ElEsido
17-07-2009, 17:27
Hallo

Kann man in einem Befehl den Parameter in Kleinschrift umwandeln und so weiter verwenden? Im folgenden Beispiel funktioniert der auskommentierte Teil nicht (Un-Kommentieren erzeugt eine Fehlermeldung. Kriegt man etwas mit der dargestellten Funktionalität hin?


\documentclass[11pt, ngerman,oneside]{scrbook}
\usepackage[acronym=true]{glossaries}
\makeglossaries
\newacronym{abl}{ABl}{Amtsblatt}



\newcommand{\neueskommando}[1]{%
Die Eingabe {#1} wird umgewandelt in \MakeLowercase{#1} und steht für die Abkürzung
%\gls{\MakeLowercase{#1}}
}

\begin{document}

Amtsblatt\\
\gls{abl}\\
\neueskommando{ABl}



\end{document}

Grüsse
ElEsido

mechanicus
17-07-2009, 17:50
Hallo,

war das vielleicht zu Minimal :rolleyes:


\documentclass[11pt, ngerman,oneside]{scrbook}
\usepackage[acronym=true]{glossaries}
\makeglossaries
\newacronym{abl}{ABl}{Amtsblatt}


\newacronym{ABl}{\protect\MakeLowercase{ABl}}{ABlA BlABlABlABlABl}

\newcommand{\neueskommando}[1]{%
Die Eingabe {#1} wird umgewandelt in \MakeLowercase{#1} und steht für die Abkürzung
\gls{#1}}
% }

\begin{document}

Amtsblatt\\
\gls{abl}\\
\neueskommando{ABl}

\printglossary[type=\acronymtype]

\end{document}


Gruß
Marco

ElEsido
18-07-2009, 09:16
Sorry, dieser Treffer war (für einmal) nicht auf der Scheibe ;-)

Die Definition des acronyms soll

newacronym{abl}{ABl}{Amtsblatt}
sein, der normale Aufruf wäre also
\gls{abl}

Ich suche eine Möglichkeit, mit dem Befehl
\neueskommando{ABl} den Aufruf
\gls{abl} zu triggern. Der Parameter hinter dem Befehl soll nicht verändert werden, und das acronym auch nicht, der Paramter soll stattdessen innerhalb des Befehls in Kleinbuchstaben umgewandelt und dann zum Aufrufen des acronyms verwendet werden.

Mein Beispiel war sehr kurz, tatsächlich brauche ich aber den Parameter innerhalb des Befehls sowohl in Originaleingabe wie auch alles in Kleinschrift.

u_fischer
18-07-2009, 14:30
\newcommand{\neueskommando}[1]{%
Die Eingabe {#1} wird umgewandelt in \MakeLowercase{#1} und steht für die Abkürzung
\MakeLowercase{\noexpand\gls{#1}}}

ElEsido
19-07-2009, 14:23
Super, danke Ulrike!

ElEsido
20-07-2009, 12:12
Leider habe ich das Beispiel etwas zu stark vereinfacht und es funktioniert in der tatsächlichen Anwendung nicht. Diese ist wie folgt: In einem Biblatex-Stil soll das Feld journaltitle geprüft werden und je nach Inhalt ein unterschiedliches Makro aufgerufen werden. Die Schriebweise innerhalb des Journal-Feldes kann jedoch zwischen den folgenden drei Fällen variieren:

- ABL
- \gls{abl}
- {\gls{abl}}

Ausgeschrieben sieht die Sache so aus:

\newcommand{\journalcheck}{%
% Fälle
\iffieldundef{howpublished}
{% Test, ob Journaltitle {\gls{abl}}, \gls{abl} oder ABl
\iffieldequalstr{journaltitle}{{\gls{abl}}}{\usebi bmacro{abl}}%
{\iffieldequalstr{journaltitle}{\gls{abl}}{\usebib macro{abl}}
{\iffieldequalstr{journaltitle}{ABl}{\usebibmacro{ abl}}
{% Test ob Journaltitle {\gls{rpw}}, \gls{rpw} oder RPW
\iffieldequalstr{journaltitle}{{\gls{rpw}}}{\usebi bmacro{rpw}}
{\iffieldequalstr{journaltitle}{\gls{rpw}}{\usebib macro{rpw}}
{\iffieldequalstr{journaltitle}{RPW}{\usebibmacro{ rpw}}
{% Test ob Journaltitle BGE
\iffieldequalstr{journaltitle}{{\gls{bge}}}{\usebi bmacro{bge}}
{\iffieldequalstr{journaltitle}{\gls{bge}}{\usebib macro{bge}}
{\iffieldequalstr{journaltitle}{ABL}{\usebibmacro{ bge}}
{% Alle andern
\usebibmacro{andere}}}}}}}}}}}
{\printfield{howpublished}}
}

Ich möchte sie jedoch mit dem Befehl

\jounalcheck{ABl} aufrufen, also müsste es irgendwie so aussehen:


\newcommand{\journalcheck}[1]{%
% Fälle
\iffieldundef{howpublished}
{% Test, ob Journaltitle {\gls{abl}}, \gls{abl} oder ABl
\iffieldequalstr{journaltitle}{{\gls{#1 in Kleinschrift}}}{\usebibmacro{abl}}%
{\iffieldequalstr{journaltitle}{\gls{#1 in Kleinschrift}}{\usebibmacro{abl}}
{\iffieldequalstr{journaltitle}{#1}{\usebibmacro{a bl}}
{% Test ob Journaltitle {\gls{rpw}}, \gls{rpw} oder RPW
\iffieldequalstr{journaltitle}{{\gls{#1 in Kleinschrift}}}{\usebibmacro{rpw}}
{\iffieldequalstr{journaltitle}{\gls{#1 in Kleinschrift}}{\usebibmacro{rpw}}
{\iffieldequalstr{journaltitle}{#1}{\usebibmacro{r pw}}
{% Test ob Journaltitle BGE
\iffieldequalstr{journaltitle}{{\gls{#1 in Kleinschrift}}}{\usebibmacro{bge}}
{\iffieldequalstr{journaltitle}{\gls{#1 in Kleinschrift}}{\usebibmacro{bge}}
{\iffieldequalstr{journaltitle}{#1}{\usebibmacro{b ge}}
{% Alle andern
\usebibmacro{andere}}}}}}}}}}}
{\printfield{howpublished}}
}

Gibt es eine Möglichkeit? Beispielsweise mit der Definition eine neuen Variable, der der Wert des Parameters 1 in Kleinschrift übergeben wird, und die dann an Stelle des #1 in Kleinschrift eingesetzt wird?

(Ein lauffähiges Minimalbeispiel ist schwierig zu erstellen, da ich dazu die ganze Baustelle meines Biblatex-Stils hochladen müsste.)

mechanicus
20-07-2009, 12:42
Hallo,

setze doch eine temp-Variable ein:
UNGETESTET:


\newcommand{\journalcheck}[1]{%
% Fälle
\def\tempA{\MakeLowercase{#1}}
\iffieldundef{howpublished}
{% Test, ob Journaltitle {\gls{abl}}, \gls{abl} oder ABl
\iffieldequalstr{journaltitle}{{\gls{\tempA}}}{\us ebibmacro{abl}}%
{\iffieldequalstr{journaltitle}{\gls{\tempA}}{\use bibmacro{abl}}
{\iffieldequalstr{journaltitle}{#1}{\usebibmacro{a bl}}
{% Test ob Journaltitle {\gls{rpw}}, \gls{rpw} oder RPW
\iffieldequalstr{journaltitle}{{\gls{\tempA}}}{\us ebibmacro{rpw}}
{\iffieldequalstr{journaltitle}{\gls{\tempA}}{\use bibmacro{rpw}}
{\iffieldequalstr{journaltitle}{\tempA}{\usebibmac ro{rpw}}
{% Test ob Journaltitle BGE
\iffieldequalstr{journaltitle}{{\gls{\tempA}}}{\us ebibmacro{bge}}
{\iffieldequalstr{journaltitle}{\gls{\tempA}}{\use bibmacro{bge}}
{\iffieldequalstr{journaltitle}{#1}{\usebibmacro{b ge}}
{% Alle andern
\usebibmacro{andere}}}}}}}}}}}
{\printfield{howpublished}}
}



Das funktioniert:

\documentclass{article}
\parindent0pt
\newcommand{\journalcheck}[1]{%
\def\tempA{\MakeLowercase{#1}}
\tempA}
\begin{document}
\journalcheck{ABL}

\journalcheck{AbL}

\journalcheck{abl}
\end{document}

Gruß
Marco

ElEsido
20-07-2009, 13:10
Das funktioniert leider nicht, mit der Definition
\def\tempA{\MakeLowercase{#1}} ergibt die Ausgabe
\tempAzwar
bge aber die Prüfung \iffieldequalstr
{\gls{\tempA}} wird als ungleich
{\gls{bge}} erkannt und der fallback-Befehl
usebibmacro{andere} wird ausgeführt...

u_fischer
20-07-2009, 14:25
Hm. Ich denke, du hast nicht den richtigen Ansatz. Ein \if-Schachtelung über vier Ebenen, die dann auch noch mit "alle anderen" weitergeht, kann irgendwie nicht die richtige Idee sein.

Wenn ich das richtig sehe, dann ist der Inhalt des Feldes journaltitle im Makro \abx@field@journaltitle gespeichert. Ich würde einfach diesen Inhalt benutzen, um unterschiedliche Befehle auszuführen (Ich gehe dabei davon aus, dass der Inhalt keine komplizierten Dinge enthält.). Außerdem würde ich \gls lokal umdefinieren.


\documentclass[11pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}

\begin{document}

\makeatletter
\def\bibmacrofor@abl{Benutze ABL!}
\def\bibmacrofor@ABL{Benutze ABL!}
\def\bibmacrofor@rpw{Benutze RPW}
% usw ....

\newcommand\journalcheck{%
\begingroup
\def\gls##1{##1}%
\csname bibmacrofor@\abx@field@journaltitle\endcsname
\endgroup}

\def\abx@field@journaltitle{\gls{abl}}
\journalcheck

\def\abx@field@journaltitle{abl}
\journalcheck

\def\abx@field@journaltitle{ABL}
\journalcheck

\def\abx@field@journaltitle{rpw}
\journalcheck

\end{document}

ElEsido
20-07-2009, 15:39
Ulrike, das tönt wonach ich suche, aber ich komm bei Deinem Code nicht ganz draus (bin kein Programmierer).

Ich erkläre mal das Endziel, zu dem ich mich hintasten will:

Bei der Definition der Cite-Befehle will ich die Typen @jurisdiction und @legislation abfangen und ihnen Makros zur Zitierweise zuweisen.

Bei der Zitierweise müssen die Einträge der Zeitschriften RPW, ABl und BGE (möglicherweise später noch weitere) gesondert behandelt werden. Im enrsprecheneden BIB-File können die Zeitschriftentitel ausgeschrieben sein, oder mit dem Paket glossaries als Abkürzungen verwaltet sein. Sie können also die Form "ABl", "\gls{abl}" oder "{\gls{abl}}" haben.

Zudem gibt es ein Makro für den Zitierstil aller andern Zeitschriftentitel des Typs @jurisdiction und @legislation.

Für jede Zitierweise (footcite, cite, cite*) hat jede dieser Zeitschriften ihre eigenen Regeln, welche im entsprechenden Makro festgehalten sind.

Zudem werden in diesen Zeitschriften (zumindest im ABl) sowohl Gesetze (@legislation) als auch Fälle {@jurisdiction} veröffentlicht. Ausserdem muss ich die Trennung der verschiedenen Zeitrschriften sowohl für die Zitierweise als auch für das Literaturverzeichnis machen.

Meine Idee war, dass ich den Code, der die Trennung der verschiedenen a) Zitierweisen, b) Eintragstypen, c) Zitierart (Zitat oder Verzeichnis) und d) Zeitschriften vornimmt und den Einträgen die entsprechenden Makros zuordnet, an einem Ort zusammenfassen kann.

Momentan ist er noch ausgeschrieben (vgl. attachment). Ich wollte eine Lösung finden, die mir erlaubt, den die Sortierung der Zeitschriften und die Generierung der Makro-Namen zusammen zu fassen, ohne dass ich die Titel der Zeitschriften in das Makro reinprogrammieren muss.

So in der Art: Bei der Definition der Zitierweise würde der Befehl


\journalcheck{< Zitierweise "cite", "footcite" oder "citestar" >}{< entrytype "legislation" oder "jurisdiction" >}{< "cbx" (Zitat) oder "bbx" (Bibliographie) >}{< Zeitschrift1 >}{< Zeitschrift2 >}{< Zeitschrift3 >}{< Zeitschrift4 >} beispielsweise das Makro #1#2#3#6 aufrufen.

Konkret:


\DeclareCiteCommand{\cite}%
{\usebibmacro{prenote}}
{\usebibmacro{citeindex}%
\ifthenelse{\equal{\thefield{entrytype}}{jurisdict ion}}{\journalcheck{cite}{jurisdiction}{cbx}{ABl}{ RPW}{BGE}{VPB}}{\ifthenelse{\equal{\thefield{entry type}}{legislation}}{\journalcheck{cite}{legislati on}{cbx}{ABl}{RPW}{BGE}{VPB}}{\usebibmacro{cite}}} }
{\multicitedelim}
{\usebibmacro{postnote}}

schickt beispielsweise einen Fall der RPW an das Makro citejurisdicioncbxRPW
und einen Fall des ABl an das Makro citejurisdicioncbxABl
und einen Fall der in der XYZ publiziert ist an das Makro citejurisdicioncbxalleandern

Geht das?

Um dahin zu kommen, wollte ich eben, die verschiedenen IF-Abfragen machen und diese durch Parameter des Befehls steuern lassen (wobei eben die Parameter in Kleinschrift übersetzt werden müssen um auf Übereinstimmung z.B. mit der Zeichenkette \gls{abl} geprüft zu werden). Die Ausgabe der Makro-Namen aufgrund der Parameter wäre dann wohl noch ein einfaches...

u_fischer
20-07-2009, 16:17
Ich weiß von biblatex nur sehr wenig und habe sicherlich nicht die Zeit mich da jetzt reinzuhängen. Ich kann daher eine grundsätzlich Bemerkung machen: Soweit ich das verstanden habe, hast du ein Feld und je nach Wert dieses Feldes möchtest du etwas anderes machen.

Nun sowas kann man auf zwei Arten machen: Man geht entweder nacheinander die möglichen Werte durch und vergleicht sie mit dem Feldinhalt.

Oder man baut eine Datenbank auf, die zu jedem möglichen Wert die dazughörige Aktion speichert, und benutzt diese dann.


\documentclass[]{scrartcl}
\usepackage{ifthen}
\begin{document}
Verschiedene Ausgaben je nach Wert des Arguments

Variante 1: mit vielen ifthenelse-Vergleichen:

\newcommand\mytest[1]{%
\ifthenelse{\equal{#1}{A}}
{AX}
{\ifthenelse{\equal{#1}{B}}
{BX}
{\ifthenelse{\equal{#1}{C}}
{CX}
{was anderes}}}}

\mytest{A}, \mytest{B}, \mytest{C}, \mytest{D}

Variante 2:

\def\aktionA{AX}
\def\aktionB{BX}
\def\aktionC{CX}

\renewcommand\mytest[1]{%
\ifcsname aktion#1\endcsname
\csname aktion#1\endcsname
\else
was anderes
\fi}


\mytest{A}, \mytest{B}, \mytest{C}, \mytest{D},
\def\temp{C}\mytest{\temp}
\end{document}


Die zweite Methode ist meist sehr viel übersichtlicher und auch leichter zu erweitern: Es reicht ein einfach \def\aktionD{DX}. Und du kannst den Werten auch leicht weitere Aktionen zuordnen (\def\weitereaktionA{AXX} ...) Allerdings dürfen die Werte (A,B, C, ....) nicht zu komplex sein. Und du musst eine klare Vorstellung habe, wie die Aktionen aussehen.

ElEsido
20-07-2009, 16:41
Danke Ulrike, das ist tatsächlich die übersichtlichere Variante. Ich versuche mich mal damit...

ElEsido
11-08-2009, 10:32
Ich komme noch einmal auf das Folgende zurück:

Wenn ich das richtig sehe, dann ist der Inhalt des Feldes journaltitle im Makro \abx@field@journaltitle gespeichert. Ich würde einfach diesen Inhalt benutzen, um unterschiedliche Befehle auszuführen (Ich gehe dabei davon aus, dass der Inhalt keine komplizierten Dinge enthält.). Außerdem würde ich \gls lokal umdefinieren.


\documentclass[11pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}

\begin{document}

\makeatletter
\def\bibmacrofor@abl{Benutze ABL!}
\def\bibmacrofor@ABL{Benutze ABL!}
\def\bibmacrofor@rpw{Benutze RPW}
% usw ....

\newcommand\journalcheck{%
\begingroup
\def\gls##1{##1}%
\csname bibmacrofor@\abx@field@journaltitle\endcsname
\endgroup}

\def\abx@field@journaltitle{\gls{abl}}
\journalcheck

\def\abx@field@journaltitle{abl}
\journalcheck

\def\abx@field@journaltitle{ABL}
\journalcheck

\def\abx@field@journaltitle{rpw}
\journalcheck

\end{document}

Es kann sein, dass im Feld Journaltitle steht: "{\gls{abl}}". Die Zeile

\def\abx@field@journaltitle{{\gls{abl}}}
\journalcheck
wird jedoch nicht erkannt, da zuerst die äussersten Klammern entfernt werden müssten.

Ich habe diesen Code gefunden, der das zu machen scheinT, kann ihn aber nicht auf das obige Beispiel anpassen. Weiss jemand Rat?



% \@defstrip defines a command that assumes that the true argument
% comes embraced in braces "{}", and first strips off those braces,
% before passing it to the parameter text.
\def\@defstrip#1#2#{%
\def#1##1{\@nameuse{\name#1.}##1}%
\@namedef{\name#1.}#2}

\def\@name@defstrip#1{\expandafter\@defstrip\csnam e #1\endcsname}



Im folgenden MB müsste die letzte Ausgabe nicht "was anderes" sein, sondern "BENUTZE RPW".


\documentclass[11pt]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}

\begin{document}

\makeatletter
\def\bibmacrofor@abl{Benutze ABL!}
\def\bibmacrofor@ABL{Benutze ABL!}
\def\bibmacrofor@ABl{Benutze ABL!}
\def\bibmacrofor@rpw{Benutze RPW}
\def\bibmacrofor@RPW{Benutze RPW}
% usw ....

\newcommand\journalcheck{%
\begingroup
\def\gls##1{##1}%
\def\Gls##1{##1}%
\ifcsname bibmacrofor@\abx@field@journaltitle\endcsname
\csname bibmacrofor@\abx@field@journaltitle\endcsname
\else
was anderes
\fi
\endgroup
}

\def\abx@field@journaltitle{\Gls{abl}}
\journalcheck

\def\abx@field@journaltitle{abl}
\journalcheck

\def\abx@field@journaltitle{ABl}
\journalcheck

\def\abx@field@journaltitle{\gls{rpw}}
\journalcheck

\def\abx@field@journaltitle{RPW}
\journalcheck

\def\abx@field@journaltitle{gugus}
\journalcheck

\def\abx@field@journaltitle{{\gls{rpw}}}
\journalcheck

\end{document}

ElEsido
11-08-2009, 10:52
Und was ich auch noch bräuchte, wäre, dass anstelle der Ausgabe "Benutze ABL!" bei

\def\bibmacrofor@abl{Benutze ABL!}
die Variable tempP auf den Wert "abl" gesezt wird.


\def\bibmacrofor@abl{\def\tempP{abl}}
funktioniert jedoch nicht.