Ao usar o pacote de acentos: símbolo grego subacentuado na legenda de uma tabela dá erro

Ao usar o pacote de acentos: símbolo grego subacentuado na legenda de uma tabela dá erro

Estou usando o pacote de acentos para colocar uma barra abaixo dos símbolos matemáticos. Isso funciona muito bem quando usado em equações, e também em texto normal (obviamente ainda no ambiente matemático $...$). Porém, atualmente estou criando uma tabela com legenda e ela não deseja compilar. De preferência, não quero usar \underbar.


MWE

\documentclass{article}

\usepackage{accents}
\newcommand{\ubar}[1]{\underaccent{\bar}{#1}}

\begin{document}

\begin{table}
\begin{tabular}{c}
a
\end{tabular}
\caption{$\ubar{\pi}$}
\end{table}

\end{document}

Primeiroerroao usar PDFTeXify no WinEdt 8.0 e MiKTeX 2.9 (na verdade recebo 100 erros).

! Undefined control sequence.
\underaccent #1#2->\begingroup \def \cc@a
                                           {#2}\cc@palette \cc@underaccent {#...
1.12 \caption{$\ubar{\pi}$}

The control sequence at the end of the top line 
of your error message was never \def'ed. If you have 
misspelled it (e.g. `\hobx'), type `I' and the correct 
spelling (e.g., `I\hbox'). Otherwise just continue,
and I'll forget about whatever was undefined.

Responder1

O accentspacote define comandos que não são robustos: por exemplo, encontramos

\newcommand\underaccent[2]{%
  \begingroup
    \def\cc@a{#2}% Stores the nucleous...
    \cc@palette\cc@underaccent{#1}% ...and the accent is passed
    #2%
  \endgroup}

Um comando como este não sobreviverá sendo encontrado em um “argumento móvel” (o argumento para \caption, e comandos semelhantes) \chapter. \sectionDefinir \ubarem termos de \underaccentfaz com que \ubarpartilhem da mesma fragilidade.

O pacote realmente deveria servir

\DeclareRobustCommand\underaccent[2]{%
  \begingroup
    \def\cc@a{#2}% Stores the nucleous...
    \cc@palette\cc@underaccent{#1}% ...and the accent is passed
    #2%
  \endgroup}

então o problema desapareceria.

Existem várias soluções. A primeira é colocar \protectna frente do comando quando ele aparece em um argumento em movimento:

\caption{$\protect\ubar{\pi}$}

Uma solução melhor seria fornecer proteção paraseucomando

\DeclareRobustCommand{\ubar}[1]{\underaccent{\bar}{#1}}

ao invés de usar \newcommand.

Uma solução ainda melhor seria remediar a falha em accents:

\documentclass{article}
\usepackage{fixltx2e}

\usepackage{accents}

\MakeRobust{\underaccent} % make \underaccent not fragile in moving arguments

\newcommand{\ubar}[1]{\underaccent{\bar}{#1}}

\begin{document}
\begin{figure}
\caption{$\ubar{\pi}$}
\end{figure}
\end{document}

Em vez de fixltx2evocê pode usar etoolbox:

\usepackage{etoolbox}

\usepackage{accents}
\robustify{\underaccent}

faria o mesmo (de uma maneira diferente).

informação relacionada