不使用 eTeX 的 \dimexpr 替换/“扩展”

不使用 eTeX 的 \dimexpr 替换/“扩展”

我想\'{\i}在书签中使用。虽然当有 eTeX 时它可以正常工作,但\dimexpr如果没有 eTeX,我就无法使用。(而且我目前使用的 TeX 发行版版本还不包含 eTeX 支持。)能否在没有 eTeX 的情况下将其“扩展”为\doaccentiTeX 可以理解的形式?

\documentclass{report}
\usepackage[unicode=true,bookmarks=true]{hyperref}

\makeatletter
\newcommand{\doaccenti}{\8\number\dimexpr0.00390625\dimexpr\number"00EDsp\relax\relax
\expandafter\HyPsd@unichar@second@byte\expandafter{%
\number\numexpr"00ED-256*\number\dimexpr0.00390625\dimexpr\number"00EDsp%
\relax\relax\relax}}
\makeatother

\begin{document}

\section[\texorpdfstring{\'{\i}}{\ifpdfstringunicode{\doaccenti}{i}}]{\'{\i}}

Text.

\end{document}

感谢您的回答!

我现在很好奇:你使用的是哪个 (La)TeX 发行版?(哪个版本和操作系统)

MacKichan ScientificWorkPlace 5.50 Build 2960(Windows XP)

但如果可能的话,你最好升级你的 TeX 发行版

这是最新版本。正在计划发布新版本。

\section[\texorpdfstring{\'{\i}}{% \ifpdfstringunicode{\string\000\string\355}{i}}]{\'{\i}} 可与基于“Knuth TeX”构建的 LaTeX 配合使用。

因此,不幸的是,SWP 不是基于“Knuth TeX”构建的 LaTeX(无法编译)。

我试过

\documentclass{report}
\usepackage[unicode=true,bookmarks=true]{hyperref}

\def\doaccenti{\80\355}

\begin{document}

\section[\texorpdfstring{\'{\i}}{\ifpdfstringunicode{\doaccenti}{i}}]{\'{\i}}

Text.

\end{document}

(以及其他方法),但得到了:

! TeX capacity exceeded, sorry [save size=5000].
@if ...1expandafter @gobbletwo string #2endcsname 
                                                  {let #1#2}
l.1449 \newif\ifcheckat@

If you really absolutely need more capacity,
you can ask a wizard to enlarge me. 

:-( 我现在能做什么?

(抱歉以答案的形式发布,谢谢 Scharrer 先生!我没有看到任何“评论”字段,因为我尚未注册。现在已更改。)

好吧,我发现即使

\documentclass{report}
\usepackage[unicode=true,bookmarks=true]{hyperref}
\begin{document}
\section[\texorpdfstring{i}{i}]{i}
Text.
\end{document}

无法编译,但是

解决方案

\documentclass{report}
\usepackage{xcolor}
\pagecolor{white}
\usepackage[unicode=true,bookmarks=true]{hyperref}
\begin{document}

\section[\texorpdfstring{\'{\i}}{\ifpdfstringunicode{\80\355}{i}}]{\'{\i}}

Text.

\end{document}

确实运行正常!

尽管如此,虽然这解决了问题,但我仍然很好奇,为什么

\usepackage{xcolor}
\pagecolor{white}

需要嗎?!

答案1

好吧,\numexpr除了\dimexprorigin TeX 之外什么都不做。但如果可能的话,你最好升级你的 TeX 发行版。

反正:

% \number\dimexpr0.00390625\dimexpr\number"00EDsp\relax\relax
\@tempdima="00EDsp
\@tempdimb=0.00390625\@tempdima
\@tempcntb=\@tempdimb
\number\@tempcntb

% \number\numexpr"00ED-256*\number\dimexpr0.00390625\dimexpr\number"00EDsp\relax\relax\relax
\@tempdima="00EDsp
\@tempdimb=0.00390625\@tempdima
\@tempcntb=\@tempdimb
\@tempcnta="00ED
\multiply\@tempcntb by 256
\advance\@tempcnta by \@tempcntb
\number\@tempcnta

但是,结果\doaccenti是一个常数。你可以简单地使用

\def\doaccenti{\80\355}

来表达unicode字符í。

答案2

如果你只需要在书签文件中写入正确的八进制字符串,则代码

\section[\texorpdfstring{\'{\i}}{%
  \ifpdfstringunicode{\string\000\string\355}{i}}]{\'{\i}}

与基于“Knuth TeX”构建的 LaTeX 兼容。

相关内容