Variable Setzung von Text durch Newcommand

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


AndyBrown
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Fr 9. Aug 2013, 13:22

Variable Setzung von Text durch Newcommand

Beitrag 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

Epllus
Forum-Guru
Forum-Guru
Beiträge: 470
Registriert: So 23. Sep 2012, 17:31

Beitrag 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

AndyBrown
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Fr 9. Aug 2013, 13:22

Beitrag von AndyBrown »

Supergenial!

Funktioniert!


Vielen Dank



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

Benutzeravatar
cgnieder
Forum-Meister
Forum-Meister
Beiträge: 730
Registriert: Fr 22. Okt 2010, 18:37
Wohnort: Herrenberg
Kontaktdaten:

Beitrag 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
Clemens
Paketauthor

Antworten