Variable Setzung von Text durch Newcommand

Antwort erstellen


Diese Frage dient dazu, das automatisierte Versenden von Formularen durch Spam-Bots zu verhindern.
Smilies
:D :) :( :o :shock: :? 8) :lol: :-x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode ist eingeschaltet
[img] ist eingeschaltet
[flash] ist ausgeschaltet
[url] ist eingeschaltet
Smilies sind eingeschaltet

Die letzten Beiträge des Themas

Ich habe die Datenschutzerklärung gelesen und bin damit einverstanden.

   

Wenn du eine Datei oder mehrere Dateien anhängen möchtest, gib die Details unten ein.

Ansicht erweitern Die letzten Beiträge des Themas: Variable Setzung von Text durch Newcommand

von cgnieder » Sa 10. Aug 2013, 14:27

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

von AndyBrown » Sa 10. Aug 2013, 08:44

Supergenial!

Funktioniert!


Vielen Dank



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

von Epllus » Fr 9. Aug 2013, 19:11

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

Variable Setzung von Text durch Newcommand

von AndyBrown » Fr 9. Aug 2013, 13:58

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

Nach oben