与图片标题中的 \fi 冲突

与图片标题中的 \fi 冲突

我有以下序言:

\documentclass[11pt]{book}

% PACKAGES
% graphics packages
    \usepackage{graphics}
    \usepackage[pdftex]{graphicx}
% negative phantoms (\nphantom, \nhphantom, \nvphantom)
    \catcode`@=11
    \def\nvphantom{\v@true\h@false\nph@nt}
    \def\nhphantom{\v@false\h@true\nph@nt}
    \def\nphantom{\v@true\h@true\nph@nt}
    \def\nph@nt{\ifmmode\def\next{\mathpalette\nmathph@nt}\else\let\next\nmakeph@nt\fi\next}
    \def\nmakeph@nt#1{\setbox\z@\hbox{#1}\nfinph@nt}
    \def\nmathph@nt#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\nfinph@nt}
    \def\nfinph@nt{\setbox\tw@\null \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@\fi\ifh@ \wd\tw@-\wd\z@\fi \box\tw@}
% frequently used symbols
    \renewcommand{\hbar}{h\nhphantom{h}\bar{\phantom{n}}}

代码negative phantoms的作用正如它所说的:它允许我使用\nhphantom(例如)创建一个\phantom具有负宽度的。然后我重新定义\hbar为使用\nhphantom(我知道数学符号包中已经\hbar内置了一个命令;这不是重点。)

下面的代码可以正常工作:

\begin{document}

$\hbar$

\end{document}

\begin{document}

\begin{figure}
{\includegraphics[width=\linewidth]{fig-Raman-spontaneous.pdf}}
\caption{$h$}
\end{figure}

\end{document}

但是,如果我在图片标题中添加$\hbar$,代码将无法编译(我使用的是 XeLaTeX)。查看编译日志,似乎\fi负幻影定义中的是导致问题的原因:

在此处输入图片描述

有没有办法解决这个问题,最好是允许\fi在图形标题内使用,而不是强迫我重新定义负幻影或\hbar命令?

提前致谢。

答案1

你必须使用\DeclareRobustCommand{\hbar}{h\nhphantom{h}\bar{\phantom{n}}}而不是\renewcommand

脆弱命令和坚固命令之间有什么区别?了解原因的更多信息。

答案2

使用负幻影不是解决问题的最佳方法;在零宽度框中排版栏更简单(我还添加了一点备份,您可以根据需要进行调整)。

主要问题是\hbar应该使其变得稳健。

\documentclass[11pt]{book}
\usepackage{amsmath,mathtools}

% PACKAGES
% graphics packages
\usepackage{graphicx}

\renewcommand{\hbar}{{%
  \mathrlap{\mspace{-1mu}\bar{\phantom{x}}}h%
}}
\MakeRobust{\hbar}

\begin{document}

\begin{figure}
\centering

\includegraphics[width=0.5\linewidth]{example-image}

\caption{$\hbar$}

\end{figure}

\end{document}

在此处输入图片描述

相关内容