Makroerweiterung und Biocon-Paket

Makroerweiterung und Biocon-Paket

Ich verwende das bioconPaket, um Pflanzen in einer akademischen Arbeit zu organisieren. Ich habe bei Bedarf neue Taxone im Text erstellt, zum Beispiel die Familie. Im letzten Kapitel der Arbeit habe ich eine große Tabelle (ca. 300 Einträge), in der einige Informationen zu den Pflanzen aufgelistet sind (die ich in allen neuen Taxonen habe).

Eine solche Tabelle ist alphabetisch nach Familie organisiert. Daher habe ich in einigen Fällen wiederkehrende Familien in der ersten Spalte. In diesem Fall muss ich nur das erste Vorkommen der Familie drucken und die übrigen sollten leer bleiben.

Ich habe einen Workaround erstellt, der aber nicht mit funktioniert biocon. Zur Vereinfachung habe ich im folgenden MWE die Tabelle weggelassen und verwende stattdessen die gleiche Struktur im Klartext:

\documentclass{article}
\usepackage{biocon}
\usepackage{ifthen}

\begin{document}

\newtaxon{family}
\newtaxastyle{Family}{\taxon{!family!}}

\newplant{araca}{genus=Psidium, epithet=cattleianum, author=Sabine, family=Myrtaceae}
\newplant{acafrao}{genus=Curcuma, epithet=longa, author=L., family=Zingiberaceae}
\newplant{gengibre}{genus=Zingiber, epithet=officinale, author=Roscoe, family=Zingiberaceae}

Testing the new taxon: \plant[Family]{araca}.

\newcommand{\myval}{}

\newcommand{\setMyVal}[1]{\gdef\myval{#1}}

\newcommand{\printOnlyFirstOccurence}[1]{
    \ifthenelse{\equal{\myval}{#1}}
        {}
        {\setMyVal{#1}(\myval)}%else
}

The same plant obviously would have the same family, thus: 
\plant[f]{araca}\printOnlyFirstOccurence{\plant[Family]{araca}} and \plant[f]{araca}\printOnlyFirstOccurence{\plant[Family]{araca}};

However, these two have the same family, and yet they are printed duplicated: 
\plant[f]{acafrao}\printOnlyFirstOccurence{\plant[Family]{acafrao}} and \plant[f]{gengibre}\printOnlyFirstOccurence{\plant[Family]{gengibre}};

\end{document}

Im obigen Beispiel verwende ich die Definition von, \printOnlyFirstOccurenceum zu entscheiden, ob der wissenschaftliche Name einer Pflanze von ihrem Familiennamen begleitet wird oder nicht. Ich möchte nur das erste Vorkommen (in der Reihenfolge) einer Familie anzeigen (das ist dasselbe wie für die Tabelle, aber hier schlägt mein Beispiel im Klartext fehl).

Die Ausgabe des zweiten Beispiels lautet:

Testen des neuen Taxons: Myrtaceae. Dieselbe Pflanze würde offensichtlich zur selben Familie gehören, also:Psidium cattleianum(Myrtaceae) undPsidium cattleianum; Diese beiden gehören jedoch zur selben Familie und werden dennoch doppelt gedruckt:Kurkuma langa(Zingiberaceae) undZingiber officinale(Zingiberaceae);

Die gewünschte Ausgabe ist jedoch:

Testen des neuen Taxons: Myrtaceae. Dieselbe Pflanze würde offensichtlich zur selben Familie gehören, also:Psidium cattleianum(Myrtaceae) undPsidium cattleianum; Diese beiden gehören jedoch zur selben Familie und werden dennoch doppelt gedruckt:Kurkuma langa(Zingiberaceae) undZingiber officinale;

Irgendwelche Gedanken?

Antwort1

Wir können die Syntax auch vereinfachen, indem wir einen Befehl bereitstellen \plantF, der den Familiennamen automatisch hinzufügt, vorausgesetzt, es handelt sich nicht um den gleichen Namen wie bei der zuletzt gesetzten Familie.

Die Idee ist die gleiche wie Ihre, aber wir müssen uns mit den internen Vorgängen befassen. Insbesondere wird der Familienname für aracain gespeichert \Paraca@family.

\documentclass{article}
\usepackage{biocon}
\usepackage{pdftexcmds}

\makeatletter
\newcommand{\opt@family}[1]{%
  \ifnum\pdf@strcmp{\csname P#1@family\endcsname}{\plantfamily@last}=\z@
  \else
    \protected@xdef\plantfamily@last{\csname P#1@family\endcsname}%
    \ (\plant[Family]{#1})%
  \fi
}
\newcommand{\resetfamily}{\gdef\plantfamily@last{}} % reinitialize
\resetfamily % initialize

% user command
\newcommand{\plantF}[2][]{%
  \plant[#1]{#2}\opt@family{#2}%
}
\makeatother

\begin{document}

\newtaxon{family}
\newtaxastyle{Family}{\taxon{!family!}}

\newplant{araca}{genus=Psidium, epithet=cattleianum, author=Sabine, family=Myrtaceae}
\newplant{acafrao}{genus=Curcuma, epithet=longa, author=L., family=Zingiberaceae}
\newplant{gengibre}{genus=Zingiber, epithet=officinale, author=Roscoe, family=Zingiberaceae}

Testing the new taxon: \plant[Family]{araca}.

The same plant obviously would have the same family, thus: 
\plantF[f]{araca} and \plantF[f]{araca}.

However, these two have the same family:
\plantF[f]{acafrao} and \plantF[f]{gengibre}.

The same plant obviously would have the same family, thus: 
\plantF[f]{araca} and \plantF[f]{araca}.

\resetfamily

The same plant obviously would have the same family, thus: 
\plantF[f]{araca} and \plantF[f]{araca}.

\end{document}

Beachten Sie, dass die Familie im letzten Absatz aufgrund von erneut gedruckt wird \resetfamily.

Bildbeschreibung hier eingeben

Antwort2

Ich habe die anderen Antworten absichtlich zuerst stehen lassen, damit meine oben aufgelistet werden ;-)

\documentclass{article}
\usepackage{biocon}
%\usepackage{ifthen}% already loaded by biocon

\newcommand*\OnlyFirstPlantFamily [1]{%
    \expandafter\ifx\csname OnlyFirst@\csname P#1@family\endcsname\endcsname
                    \relax
    \space(\plant[Family]{#1})%
    \global\expandafter
           \let\csname OnlyFirst@\csname P#1@family\endcsname\endcsname \empty
    \fi
}

\begin{document}

\newtaxon{family}
\newtaxastyle{Family}{\taxon{!family!}}

\newplant{araca}{genus=Psidium, epithet=cattleianum, author=Sabine, family=Myrtaceae}
\newplant{acafrao}{genus=Curcuma, epithet=longa, author=L., family=Zingiberaceae}
\newplant{gengibre}{genus=Zingiber, epithet=officinale, author=Roscoe, family=Zingiberaceae}

Testing the new taxon: \plant[Family]{araca}.

The same plant obviously would have the same family, thus: 
\plant[f]{araca}\OnlyFirstPlantFamily{araca} and \plant[f]{araca}\OnlyFirstPlantFamily{araca};

However, these two have the same family, and yet they are printed duplicated: 
\plant[f]{acafrao}\OnlyFirstPlantFamily{acafrao} and
\plant[f]{gengibre}\OnlyFirstPlantFamily{gengibre};

\end{document}

Verwendet Innereien von Biocon.

Blockquote

Antwort3

Das wird nicht funktionieren. \plant[Family]{acafrao}ist ein sehr komplizierter Befehl und absolut nicht erweiterbar und Sie können ihn nicht in ifthenelse verwenden.

Sie können so etwas versuchen, aber ich kenne das Paket nicht und kann daher nur vermuten, dass es funktionieren wird:

\documentclass{article}
\usepackage{biocon}
\usepackage{ifthen}

\begin{document}

\newtaxon{family}
\newtaxastyle{Family}{\taxon{!family!}}

\newplant{araca}{genus=Psidium, epithet=cattleianum, author=Sabine, family=Myrtaceae}
\newplant{acafrao}{genus=Curcuma, epithet=longa, author=L., family=Zingiberaceae}
\tracingmacros=1
\newplant{gengibre}{genus=Zingiber, epithet=officinale, author=Roscoe, family=Zingiberaceae}
\tracingmacros=0
Testing the new taxon: \plant[Family]{araca}.

\makeatletter
\newcommand\Lastfamily{}
\def\Lastfamily{}
\newcommand{\printOnlyFirstOccurence}[1]{%
 \edef\Newfamily{\csname \curr@ntid family\endcsname}%
 \ifthenelse{\equal{\Lastfamily}{\Newfamily}}
        {}
        { #1}%else
 \let\Lastfamily\Newfamily        
}
\makeatother

The same plant obviously would have the same family, thus:
\plant[f]{araca}\printOnlyFirstOccurence{\plant[Family]{araca}} and \plant[f]{araca}\printOnlyFirstOccurence{\plant[Family]{araca}};

However, these two have the same family, and yet they are printed duplicated:
\plant[f]{acafrao}\printOnlyFirstOccurence{\plant[Family]{acafrao}} and \plant[f]{gengibre}\printOnlyFirstOccurence{\plant[Family]{gengibre}};

\end{document}

verwandte Informationen