Я использую 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. Очевидно, что одно и то же растение будет иметь одно и то же семейство, таким образом:Psidium cattleianum(Миртовые) иPsidium cattleianum; Однако эти два имеют одно и то же семейство, и тем не менее они напечатаны дважды:Куркума длинная(Имбирные) иИмбирь лекарственный(Имбирные);
Но желаемый результат:
Тестирование нового таксона: Myrtaceae. Очевидно, что одно и то же растение будет иметь одно и то же семейство, таким образом:Psidium cattleianum(Миртовые) иPsidium cattleianum; Однако эти два имеют одно и то же семейство, и тем не менее они напечатаны дважды:Куркума длинная(Имбирные) иИмбирь лекарственный;
Есть предположения?
решение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}