Эта статья является подвопросом:Перекрестные ссылки на 2 вида концевых сносок (разделенные и с разноцветными цифрами)
Привет,
Я пытаюсь адаптировать пакет под названием parnotes (который можно вызвать с помощью \usepackage{parnotes}
. Его исходный код можно загрузитьв CTAN здесь.
Строка кода, которую я хочу «адаптировать» (т.е. изменить при реализации в другом .tex-документе), находится внутри следующего фрагмента:
\long\def\PN@parnote@real#1{
\global\advance\c@PN@t\@ne
\g@addto@macro\PN@text{
\global\advance\c@PN@n\@ne
\parnotemarkfmt{PN@n}\nolinebreak\thinspace#1
\unless\ifnum\c@PN@n=\c@PN@t
\parnoteintercmd
\fi
}
\unskip\parnotemarkfmt{PN@t}
}
Единственная строка, которую я хочу изменить, это последняя. Я бы хотел, чтобы она стала:
\unskip\textsuperscript{\parnotemarkfmt{PN@t}}
Я знаю, когда это изменение работает идеально (я подправил загружаемый исходный код на CTAN), но я хотел бы попросить вас о помощи, так как я не знаю, как изменить эту строку кода извне (т. е. из нового .tex-файла).
Я бы подумал (поскольку мне удалось адаптировать еще одну строку исходного кода таким образом), что в преамбуле нового .tex-документа можно было бы использовать:
\makeatletter
\renewcommand{...???...}
\makeatother
Или, может быть, кто-то знает альтернативный способ использования \let ...
?
Спасибо заранее.
решение1
Вот минимальный пример:
\documentclass{article}
\usepackage{parnotes}
\begin{document}
\begin{autopn}
Text\parnote{parnote}
Text
\end{autopn}
\end{document}
который выводит
С вашим предложенным изменением это стало бы
это определенно плохо, потому что показатель степени слишком велик (помимо того, что он слишком мал, но это вопрос вкуса).
«Простой» способ, с помощью которого я создал пример, это
\usepackage{etoolbox}
\makeatletter
\patchcmd{\PN@parnote@real}
{\parnotemarkfmt{PN@t}}
{\textsuperscript{\parnotemarkfmt{PN@t}}}
{}{}
\makeatother
Существует множество примеров того, как \patchcmd
можно использовать; см., например,Пожалуйста, объясните, как использовать patchcmd и xpatch.
Однако в данном случае это неправильный путь. Действительно, пакет предоставляет \parnotemarkfmt
именно для форматирования маркера в тексте.
Его определение по пакету:
\providecommand{\parnotemarkfmt}[1]{\textsuperscript{\PN@mark@set{#1}}}
(кстати, \newcommand
здесь следует использовать , но для рассматриваемой темы это не имеет значения). Как видите, \textsuperscript
используется. Для информации, \PN@mark@set
по умолчанию то же самое, что и \arabic
.
Если вы хотите уменьшить размер экспоненты, вы можете просто изменить определение \parnotemarkfmt
. Если вы хотите меньшую экспоненту, вы можете определить \textsmallsuperscript
макрос на основе того, что \textsuperscript
делает:
% latex.ltx, line 6017:
\DeclareRobustCommand*\textsuperscript[1]{%
\@textsuperscript{\selectfont#1}}
\def\@textsuperscript#1{%
{\m@th\ensuremath{^{\mbox{\fontsize\sf@size\z@#1}}}}}
Так что мы можем сделать
\DeclareRobustCommand*\textsmallsuperscript[1]{%
\vincent@textsmallsuperscript{\selectfont#1}}
\def\vincent@textsmallsuperscript#1{%
{\m@th\ensuremath{^{\mbox{\fontsize\ssf@size\z@#1}}}}}
Использование префикса перед «внутренним макромаркером» @
является хорошей практикой.
Полный пример:
\documentclass{article}
\usepackage{parnotes}
\makeatletter
\DeclareRobustCommand*\textsmallsuperscript[1]{%
\vincent@textsmallsuperscript{\selectfont#1}}
\def\vincent@textsmallsuperscript#1{%
{\m@th\ensuremath{^{\mbox{\fontsize\ssf@size\z@#1}}}}}% <--- use scriptscriptsize
\renewcommand{\parnotemarkfmt}[1]{\textsmallsuperscript{\PN@mark@set{#1}}}
\makeatother
\begin{document}
\begin{autopn}
Text\parnote{parnote}
Text
\end{autopn}
\end{document}