Вопрос об использовании команды \renew для адаптации пакета

Вопрос об использовании команды \renew для адаптации пакета

Эта статья является подвопросом:Перекрестные ссылки на 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}

введите описание изображения здесь

Связанный контент