我有以下序言:
\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}