通过 ctable 创建的标题引用表格

通过 ctable 创建的标题引用表格

在新版本中修复了ctable

ctan-ann:CTAN 更新:ctable2012 年 5 月 26 日

这可能是一个愚蠢的问题,但是有没有办法引用(即打印)ctable 的标题?hyperref对于\nameref部分,它适用于普通浮点数,但不适用于ctable。引发此错误:

! Undefined control sequence.
<argument> \Hy@safe@activesfalse \@ctblcap
\relax
l.92 ...kewed towards commodity. \nameref{tab:ef4}

最小示例:

\documentclass[pdftex,a4paper, 12pt, DIV12, BCOR10mm, bibliography=totoc]{scrreprt} %DIV, BCOR =Seitenränder
\usepackage{ctable}
\usepackage{hyperref}

\begin{document}

\ref{tab:table} %ok
\ref{tab:ctable} %ok
\autoref{tab:table} %ok
\autoref{tab:ctable} %ok
\nameref{tab:table} %ok 
\nameref{tab:ctable} %error


\begin{table}[h]
\centering
\begin{tabular}{|l|l}
hallo & bello\\
\end{tabular}
\caption{Table}
\label{tab:table}
\end{table}

\ctable[
caption = Ctable, label=tab:ctable,]{ll}
{}{
Hello & bello \LL
}

\end{document}

答案1

问题在于如何ctable将信息写入aux。您可以在那里找到以下相关行:

\newlabel{tab:ctable}{{0.2}{1}{\@ctblcap \relax }{table.0.2}{}}

如果您使用\nameref{tab:ctable}参数{\@ctblcap \relax }被调用。但是该命令未定义,并且它使用特殊字符@。根据此信息,第一个快速修复方法是:

\makeatletter
 \def\@ctblcap{Table}
 \nameref{tab:ctable} %error
\makeatother

另一方面,你可以改变以下实现ctable

\usepackage{etoolbox} %provided \expandonce
\makeatletter
\def\@ctblCaption{
   \ifx\@ctblcap\undefined\let\@ctblcap\@ctblcaption\fi
   \ifx\@ctblcaption\empty\else
      \def\@ctblcaptionarg{\ifx\@ctbllabel\empty\else\label{\@ctbllabel}\fi
         \@ctblcaption\ \@ctblcontinued\strut}
      \ifx\@ctblcap\empty
      \begingroup
        \edef\x{\endgroup\noexpand\caption[]{\expandonce\@ctblcaptionarg}}
        \x
      \else
      \begingroup
        \edef\x{\endgroup\noexpand\caption[\expandonce\@ctblcap]%
                                          {\expandonce\@ctblcaptionarg}}
        \x
      \fi
   \fi
}
\makeatother

相关部分是以 开头的行\edef\x。例如:

\begingroup
 \edef\x{\endgroup\noexpand\caption[]{\expandonce\@ctblcaptionarg}}
\x

原始代码为:

\caption[]{\@ctblcaptionarg}

该命令caption不会扩展其参数的信息。因此,在文件中,aux您有条目。而不是我使用\@ctblcaptionarg的完全扩展,在这种情况下,这更为强大。\@ctblcaptionarg\expandonce

完整的 MWE:

\documentclass{scrreprt} %DIV, BCOR =Seitenränder
\usepackage[]{ctable}
\usepackage{etoolbox}
\usepackage{hyperref}

\makeatletter
\def\@ctblCaption{
   \ifx\@ctblcap\undefined\let\@ctblcap\@ctblcaption\fi
   \ifx\@ctblcaption\empty\else
      \def\@ctblcaptionarg{\ifx\@ctbllabel\empty\else\label{\@ctbllabel}\fi
         \@ctblcaption\ \@ctblcontinued\strut}
      \ifx\@ctblcap\empty
      \begingroup
        \edef\x{\endgroup\noexpand\caption[]{\expandonce\@ctblcaptionarg}}
         \x
      \else
      \begingroup
        \edef\x{\endgroup\noexpand\caption[\expandonce\@ctblcap]%
                                          {\expandonce\@ctblcaptionarg}}
        \x
      \fi
   \fi
}
\makeatother

\begin{document}
\begin{verbatim}
\ref{tab:table} %ok
\autoref{tab:table} %ok
\nameref{tab:table} %ok 
\end{verbatim}
\ref{tab:table} %ok
\autoref{tab:table} %ok
\nameref{tab:table} %ok 


\begin{verbatim}
\ref{tab:ctable} %ok
\autoref{tab:ctable} %ok
\nameref{tab:ctable} %error
\end{verbatim}
\ref{tab:ctable} %ok
\autoref{tab:ctable} %ok
\nameref{tab:ctable} %error

\begin{table}[h]
\centering
\begin{tabular}{|l|l}
hallo & bello\\
\end{tabular}
\caption{Table}
\label{tab:table}
\end{table}

\ctable[caption = Ctable, label=tab:ctable,]{ll}{}{
Hello & bello \LL}

\end{document}

我认为你应该向的作者写一份错误报告ctable

相关内容