매크로 확장 및 바이오콘 패키지

매크로 확장 및 바이오콘 패키지

저는 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위의 예에서 나는 식물의 학명이 성을 동반할지 여부를 결정하기 위해 정의를 사용합니다 . 나는 패밀리의 첫 번째 항목(순서대로)만 표시하고 싶습니다(표와 동일하지만 여기서는 일반 텍스트로 예제가 실패합니다).

두 번째 예제의 출력은 다음과 같습니다.

새로운 분류군 테스트: Myrtaceae. 동일한 식물은 분명히 동일한 과를 갖게 됩니다. 따라서:시디움 카틀리아눔(금상화과) 및시디움 카틀리아눔; 그러나 이 두 가지는 동일한 계열을 갖고 있지만 중복해서 인쇄됩니다.강황 롱가(징기베리과) 및징기버 오피시날레(징기베리과);

그러나 원하는 출력은 다음과 같습니다.

새로운 분류군 테스트: Myrtaceae. 동일한 식물은 분명히 동일한 과를 갖게 됩니다. 따라서:시디움 카틀리아눔(금상화과) 및시디움 카틀리아눔; 그러나 이 두 가지는 동일한 계열을 갖고 있지만 중복해서 인쇄됩니다.강황 롱가(징기베리과) 및징기버 오피시날레;

이견있는 사람?

답변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}

관련 정보