
如何重新定義\nameref
命令以將引用的標題放在引號中?
這是我嘗試過的:
\documentclass{article}
\let\oldnameref\nameref
\renewcommand{\nameref}[1]{"`\oldnameref{#1}"'} % Error: \nameref undefined.
\usepackage[pdfborder={0 0 0}]{hyperref}
\begin{document}
\begin{figure}
\caption{white rectangle}
\label{fig:figure}
\end{figure}
As shown in figure~\ref{fig:figure} \nameref{fig:figure}
\end{document}
預期結果:
如圖1“白色矩形”
答案1
\nameref
是透過\DeclareRobustCommand
packagenameref
和hyperref
in定義的\begin{document}
。因此要考慮很多事情:
的重新定義
\nameref
可以在\AtBeginDocument
後包hyperref
已載入。包
letltxmacro
負責處理內部命令,由\DeclareRobustCommand
.巨集
\nameref
可以被定義為健壯的命令\DeclareRobustCommand
。\nameref
也應提供星形形式以供參考,但不附連結。具有適當語言的套件
babel
定義了簡寫"`
和"'
。包裝也
csquotes
值得一看。
完整範例:
\documentclass{article}
\usepackage[ngerman]{babel}% some language for the shorthand
\usepackage{letltxmacro}
\usepackage[hidelinks]{hyperref}
\makeatletter
\shorthandon{"}
\AtBeginDocument{%
\LetLtxMacro\oldnameref\nameref
\DeclareRobustCommand*{\nameref}{%
\@ifstar{\my@nameref*}{\my@nameref{}}%
}%
\newcommand*{\my@nameref}[2]{%
"`\oldnameref#1{#2}"'%
}%
}
\shorthandoff{"}
\makeatother
\begin{document}
\begin{figure}
\caption{white rectangle}
\label{fig:figure}
\end{figure}
As shown in figure~\ref{fig:figure} \nameref{fig:figure}
Star form: figure~\ref*{fig:figure} \nameref*{fig:figure}
\end{document}
答案2
我更喜歡使用不同的命令並利用csquotes
:
\documentclass{article}
\usepackage[ngerman,english]{babel}% some language for the shorthand
\usepackage[autostyle=true]{csquotes}
\usepackage{xparse}
\usepackage[colorlinks]{hyperref}
\NewDocumentCommand{\qnameref}{sm}{%
\enquote{%
\IfBooleanTF{#1}{\nameref*{#2}}{\nameref{#2}}%
}%
}
\begin{document}
\begin{figure}
\caption{white rectangle}
\label{fig:figure}
\end{figure}
As shown in figure~\ref{fig:figure} \qnameref{fig:figure}
Star form: figure~\ref*{fig:figure} \qnameref*{fig:figure}
\selectlanguage{ngerman}
Abbildung~\ref{fig:figure} \qnameref{fig:figure}
Abbildung~\ref*{fig:figure} \qnameref*{fig:figure}
\end{document}
如果你只是使用英文,那麼加載babel
當然是不必要的。如果你真的想重新定義\nameref
,那麼程式碼應該會變成
\usepackage{letltxmacro} % in addition to the previous packages
\AtBeginDocument{\LetLtxMacro{\oldnameref}{\nameref}%
\RenewDocumentCommand{\nameref}{sm}{%
\enquote{%
\IfBooleanTF{#1}{\oldnameref*{#2}}{\oldnameref{#2}}%
}%
}%
}