マクロ拡大とバイオコンパッケージ

マクロ拡大とバイオコンパッケージ

私はbiocon学術論文で植物を整理するためにこのパッケージを使用しています。テキストの必要に応じて、たとえば科などの新しい分類群を作成しました。論文の最終章には、植物の情報 (すべての新しい分類群に含まれています) をリストした大きな表 (約 300 項目) があります。

このようなテーブルは、ファミリーごとにアルファベット順に整理されます。そのため、最初の列に同じファミリーが重複している場合があります。このような場合は、最初に出現するファミリーのみを印刷し、残りは空白にする必要があります。

回避策を作成しましたが、 では機能しませんbiocon。次の MWE では簡略化のためにテーブルを省略し、代わりにプレーンテキストで同じ構造を使用しています。

\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}

上記の例では、の定義を使用して、\printOnlyFirstOccurence植物の学名に科名が付随するかどうかを決定します。科の最初の出現 (シーケンス内) のみを表示したいのです (表の場合と同じですが、ここでは私の例はプレーン テキストでは失敗します)。

2 番目の例の出力は次のとおりです。

新しい分類群のテスト: フトモモ科。同じ植物は明らかに同じ科に属します。つまり、プシディウム・カトリアヌム(フトモモ科)とプシディウム・カトリアヌム; ただし、これら 2 つは同じファミリーに属していますが、重複して印刷されます。ウコン(ショウガ科) およびショウガ(ショウガ科)

しかし、望ましい出力は次のようになります。

新しい分類群のテスト: フトモモ科。同じ植物は明らかに同じ科に属します。つまり、プシディウム・カトリアヌム(フトモモ科)とプシディウム・カトリアヌム; ただし、これら 2 つは同じファミリーに属していますが、重複して印刷されます。ウコン(ショウガ科) およびショウガ;

何かご意見は?

答え1

\plantFまた、タイプセットされた最後のファミリと同じでない場合は、ファミリ名を自動的に追加するコマンドを提供することで、構文を簡素化することもできます。

考え方はあなたと同じですが、内部を詳しく調べる必要があります。特に、 の姓は にaraca格納されています\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}

最後の段落では、 のためにファミリーが再度印刷されていることに注意してください\resetfamily

ここに画像の説明を入力してください

答え2

私は自分の回答が一番上に表示されるように、わざと他の回答を先に残しました ;-)

\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}

バイオコンの内部部品を使用しています。

引用ブロック

答え3

これは機能しません。\plant[Family]{acafrao}非常に複雑なコマンドであり、まったく拡張できず、ifthenelse で使用することはできません。

次のようなものを試すこともできますが、パッケージがわからないため、動作するかどうかは推測するだけです。

\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}

関連情報