在新版本中修复了
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
。