Uma pergunta sobre como usar um \renewcommand para adaptar um pacote

Uma pergunta sobre como usar um \renewcommand para adaptar um pacote

Este artigo é uma subquestão de:Referência cruzada em 2 tipos de notas finais (separadas e com números de cores diferentes)


Oi,

Estou tentando adaptar um pacote chamado parnotes (que pode ser chamado usando \usepackage{parnotes}. Seu código fonte original pode ser baixadono CTAN aqui.

A linha de código que desejo "adaptar" (ou seja, alterar quando implementada em outro documento .tex) reside dentro da seguinte parte:

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

A única linha que quero mudar é a última. Eu gostaria que se tornasse:

    \unskip\textsuperscript{\parnotemarkfmt{PN@t}}

Eu sei quando essa mudança funciona perfeitamente (ajustei o código-fonte para download no CTAN), mas gostaria de pedir ajuda, pois não sei como alterar essa linha de código de fora (ou seja, de um novo .tex -arquivo).

Eu pensaria (já que consegui adaptar outra linha de código da fonte desta forma) alguém usaria no preâmbulo de um novo documento .tex:

\makeatletter
\renewcommand{...???...}
\makeatother

Ou talvez alguém conheça uma forma alternativa de usar \let ...?

Muito obrigado antecipadamente.

Responder1

Aqui está um exemplo mínimo:

\documentclass{article}
\usepackage{parnotes}

\begin{document}

\begin{autopn}
Text\parnote{parnote}

Text
\end{autopn}

\end{document}

quais saídas

insira a descrição da imagem aqui

Com a mudança proposta, isso se tornaria

insira a descrição da imagem aqui

isso é definitivamente ruim, porque o expoente é muito alto (além de ser muito pequeno, mas é uma questão de gosto).

A maneira “fácil” com a qual produzi o exemplo é

\usepackage{etoolbox}
\makeatletter
\patchcmd{\PN@parnote@real}
  {\parnotemarkfmt{PN@t}}
  {\textsuperscript{\parnotemarkfmt{PN@t}}}
  {}{}
\makeatother

Existem muitos exemplos de como \patchcmdpode ser usado; veja, por exemplo,Por favor, ensine o uso de patchcmd e xpatch

No entanto, neste caso, este é o caminho errado a seguir. Na verdade, o pacote fornece \parnotemarkfmtexatamente a finalidade de formatar o marcador no texto.

Sua definição pelo pacote é

\providecommand{\parnotemarkfmt}[1]{\textsuperscript{\PN@mark@set{#1}}}

(aliás, \newcommanddeveria ser usado aqui, mas não tem importância para o tópico em questão). Como você vê, \textsuperscripté usado. Para informação, \PN@mark@seté, por padrão, o mesmo que \arabic.

Se quiser reduzir o tamanho do expoente, você pode simplesmente alterar a definição de \parnotemarkfmt. Se quiser um expoente menor, você pode definir uma \textsmallsuperscriptmacro com base no que \textsuperscriptfaz:

% latex.ltx, line 6017:
\DeclareRobustCommand*\textsuperscript[1]{%
  \@textsuperscript{\selectfont#1}}
\def\@textsuperscript#1{%
  {\m@th\ensuremath{^{\mbox{\fontsize\sf@size\z@#1}}}}}

Então podemos fazer

\DeclareRobustCommand*\textsmallsuperscript[1]{%
  \vincent@textsmallsuperscript{\selectfont#1}}
\def\vincent@textsmallsuperscript#1{%
  {\m@th\ensuremath{^{\mbox{\fontsize\ssf@size\z@#1}}}}}

Usar um prefixo antes do “marcador macro interno” @é uma boa prática.

Exemplo completo:

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

insira a descrição da imagem aqui

informação relacionada