Seite 1 von 1

Variable Setzung von Text durch Newcommand

Verfasst: Fr 9. Aug 2013, 13:58
von AndyBrown
Hi Leute,

in meiner Diss tauchen etwa 200 verschiedene Pflanzennamen auf, für die ich newcommands definieren will. Diese newcommands sollen mir die Pflanzennamen im Text erzeugen. Zum Hintergrund. Pflanzennamen in der Botanik bestehen aus einem Artnamen, einem Gattungsnamen und einem Beschreiber und man gibt sie auf unterschiedliche Art an.

Art1: Schöne pflanze (Beschreiber)
Art2: Schöne pflanze
Art3: S. pflanze

Soweit, so gut. Lösen kann man das natürlich mit newcommand
\newcommand{\pflanze1}{\emph{Schöne}, \emph{pflanze}, (Beschreiber)\xspace}
Jetzt kommt aber mein Problem. Ich möchte ein "intelligentes" Newcommand, welches mir die Namen variabel setzt.

Und zwar in folgender Art und Weise. Bei der ersten Nennung im gesamten Text soll Art 1 stehen, bei der ersten Nennung in einem Chapter soll Art 2 stehen und ansonsten Art3.


Ein Minimalbeispiel, wenngleich es u.U. nicht viel Sinn macht, da das newcommand ja nicht tut...
\documentclass[]{book}
\begin{document}
\newcommand{\pflanze1}{\emph{Schoene}, \emph{pflanze}, (Beschreiber)}
\chapter{Kapitel}
\pflanze1 Hier soll stehen: Schoene pflanze (Beschreiber)\\
...\\
...\\
...
\section{Abschnitt}
\pflanze1 Hier soll stehen: S. pflanze\\
...\\
\pflanze1 Hier soll stehen: S. pflanze\\
...\\
\pflanze1 Hier soll stehen: S. pflanze\\
\section{Abschnitt}
\pflanze1 Hier soll stehen: S. pflanze\\
...\\
\chapter{Kapitel}
\pflanze1 Hier soll stehen: Schoene pflanze\\
...\\
\section{Abschnitt}
\pflanze1 Hier soll stehen: S. pflanze\\
\subsection{Unterabschnitt}
\pflanze1 Hier soll stehen: S. pflanze\\
\end{document}
Hat da jemand Ideen? Das wäre total super!!!!

Viele Grüße und vielen Dank im Voraus

Verfasst: Fr 9. Aug 2013, 19:11
von Epllus
Versuchs mal hiermit (Beschreibung unten)
\documentclass[]{book} 
\usepackage{xspace} 
\usepackage{selinput} 
\SelectInputMappings{ 
adieresis={ä}, germandbls={ß}, Euro={€}, 
} 

\newcommand{\Pflanzencommand}[4]{% 
\newcounter{Pflanze#1}[chapter]% 
\expandafter\newif\csname ifPflanze#1\endcsname% 
\expandafter\def\csname Pflanze#1Lang\endcsname{\emph{#2}}% 
\expandafter\def\csname Pflanze#1kurz\endcsname{\emph{#3}}% 
\expandafter\def\csname Pflanze#1Beschreiber\endcsname{,~(#4)}% 
} 

\newcommand{\Pfl}[1]{% 
\csname ifPflanze#1\endcsname%
   \ifnum\value{Pflanze#1}=0%
      \csname Pflanze#1Lang\endcsname%
      \stepcounter{Pflanze#1}% 
   \else 
      \csname Pflanze#1kurz\endcsname%
   \fi 
\else 
   \csname Pflanze#1Lang\endcsname%
   \csname Pflanze#1Beschreiber\endcsname%
   \expandafter\global\csname Pflanze#1true\endcsname%
\fi 
\xspace} 


% \Pflanzencommand{Pflanze}{lange Beschreibung}{k. Beschreibung}{Beschreiber} 
\Pflanzencommand{Sonnenblume}{Schöne Sonnenblume}{S. Sonnenblume}{Beschreiber} 
\Pflanzencommand{MimosaPudica}{Mimosa Pudica}{M. Pudica}{Weiß nicht} 


\begin{document} 

\Pfl{Sonnenblume} 

\Pfl{Sonnenblume} 

\Pfl{Sonnenblume} 

\Pfl{Sonnenblume} 


\chapter{Kapitel} 

\Pfl{Sonnenblume} 

\Pfl{MimosaPudica} 

\Pfl{MimosaPudica} 

\Pfl{MimosaPudica} 


\Pfl{Sonnenblume}

\end{document} 
Zuerst definierst du dir die Pflanze mittels
\Pflanzencommand{Name}{lange Form}{k. Form}{Beschreiber}
Wie etwa:
\Pflanzencommand{MimosaPudica}{Mimosa Pudica}{M. Pudica}{Beschreiber}
.
Du verwendest die Pflanze mittels
\Pfl{Name}

\Pfl{MimosaPudica}
Hoffe es ist alles korrekt, ansonsten kannst du ja nachfragen
Epllus

Verfasst: Sa 10. Aug 2013, 08:44
von AndyBrown
Supergenial!

Funktioniert!


Vielen Dank



:D :D :D :D :D :D

Verfasst: Sa 10. Aug 2013, 14:27
von cgnieder
Eine alternative Implementierung, nur so zum Spaß:
\documentclass{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}

\makeatletter
\newcommand*\newplant[3]{%
  \global\@namedef{plant@#1@desc}{\@descplant{#2}{#3}}%
  \global\@namedef{plant@#1@long}{\@longplant{#2}}%
  \global\@namedef{plant@#1@short}{\@shortplant{#2}}%
  \global\@namedef{plant@#1}{%
    \@descplant{#2}{#3}%
    \global\@namedef{@plant@#1@\roman{chapter}}{}%
    \global\@namedef{plant@#1}{%
      \@longorshortplant{#1}{#2}%
    }%
  }%
}

\def\@longorshortplant#1#2{%
  \@plant@ifnewchapter{#1}
    {\@longplant{#2}}
    {\@shortplant{#2}}%
}

\def\@descplant#1#2{\textit{#1} (#2)}
\def\@longplant#1{\textit{#1}}
\def\@shortplant#1{\@shortplant@aux#1\q@stop}
\def\@shortplant@aux#1#2 #3\q@stop{\textit{#1.\@\space #3}}

\def\@plant@ifnewchapter#1{%
  \expandafter\ifx\csname @plant@#1@\roman{chapter}\endcsname\relax
    \global\@namedef{@plant@#1@\roman{chapter}}{}%
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}

% Benutzerbefehle:
% der intelligente Befehl:
\newcommand*\plant[1]{\@nameuse{plant@#1}}
% für den direkten Zugriff:
\newcommand*\descplant[1]{\@nameuse{plant@#1@desc}}
\newcommand*\longplant[1]{\@nameuse{plant@#1@long}}
\newcommand*\shortplant[1]{\@nameuse{plant@#1@short}}
\makeatother

% neue Pflanzen:
\newplant{sonnenblume}{Schöne Sonnenblume}{ganz schön gelb}
\newplant{mpudica}{Mimosa Pudica}{Weiß nicht} 

\begin{document}

\chapter{eins}
\plant{sonnenblume}\par
\plant{sonnenblume}\par
\plant{sonnenblume}\par
\plant{sonnenblume}

\bigskip

kurz: \shortplant{sonnenblume}\par
lang: \longplant{sonnenblume}\par
mit Beschreiber: \descplant{sonnenblume}

\chapter{zwei}
\plant{sonnenblume}\par
\plant{sonnenblume}\par
\plant{sonnenblume}\par
\plant{sonnenblume}

\bigskip

\plant{mpudica}\par
\plant{mpudica}\par
\plant{mpudica}\par
\plant{mpudica}

\chapter{drei}
\plant{sonnenblume}\par
\plant{sonnenblume}\par
\plant{sonnenblume}\par
\plant{sonnenblume}

\bigskip

\plant{mpudica}\par
\plant{mpudica}\par
\plant{mpudica}\par
\plant{mpudica}

\end{document}
Grüße