我的回忆录章节标题包含法语重音字符和一些花色符号(例如 \Ts)。前者可以直接用于 PDF 书签,但我还没有找到任何可靠的方法来替换花色符号。这不是什么大问题,用字母“T”(代表 Trèfles)来近似梅花花色是可以的,我已经在 Lua 中编写了一个 Bsection 函数来生成可接受的 \texorpdfstring 函数。例如,
\Bsection{Réponses à l'ouverture de 1|Ts : Le traitement Walsh}
返回字符串
\texorpdfstring{Réponses à l'ouverture de 1\Ts : Le traitement Walsh}{Réponses à l'ouverture de 1T : Le traitement Walsh}
所以这里没有真正的问题(一个小的烦恼是使用输入 |Ts 而不是正确的 \Ts,因为我无法更改“\”的 catcode)。
我想做的是获取输入字符串“Réponses à l'ouverture de 1|Ts : Le traitement Walsh”并对其进行“清理”,以便不会写回 texorpdfstring 无法接受的字符。因此,我无法天真地解析 [az],因为除非我先设置语言环境,否则这也会删除法语重音字符。正确的做法是什么?简单的解决方法是什么?os.setlocale 是否相关?
梅威瑟:
\documentclass[a4paper, 11pt, twoside, onecolumn, dvipsnames, final]{memoir}%
\RequirePackage[scale=0.8]{fdsymbol}%
\RequirePackage[T1]{fontenc}%
\RequirePackage{fontspec}%
\RequirePackage{unicode-math}%
\setmainfont[Numbers={OldStyle,Proportional},Ligatures=TeX,Scale=MatchLowercase,Renderer=Basic]{Minion Pro}%
\newfontfamily\MinionProportional[Ligatures=TeX, Ligatures=Common,Numbers=Monospaced]{Minion Pro}%
\setmathfont{Asana Math}%
\newcommand{\Ts}{\ensuremath{\clubsuit}}%
\usepackage{luacode}
\RequirePackage[unicode=true,
psdextra,
colorlinks=true,
citecolor=DarkBlue,
filecolor=DarkBlue,
linkcolor=DarkBlue,
urlcolor=DarkBlue,
hyperfootnotes=false,
linktoc=all]{hyperref}%
\directlua{require "lualoader"%
assert(loadfile("TeXmacros.lua"))("French")%
}%
\DeclareRobustCommand{\Bsection}[1]{\directlua{Bsection([[#1]])}}%
\begin{document}
\chapter{Chapter the first}
\section{\Bsection{Réponses à l'ouverture de 1|Ts : Le traitement Walsh}}
\end{document}
Lua 函数(错误地删除了重音字符):
function Bsection(s)
local t=""
-- Take a clean copy of the input section title.
t = string.gsub(s, "[\192-\255][\128-\191]*", "")
-- Write a text only version of this string for the PDF bookmark.
t = string.gsub(t, "|Ts", "T")
-- Write Tex macro version of this string for the Memoir section.
s = string.gsub(s, "|Ts", "\\Ts")
-- Write the section back to LuaLaTeX.
t = "\\texorpdfstring{" .. s .. "}{" .. t .. "}"
tex.sprint(t)
return t
end
答案1
该问题最简单的解决方案不需要任何 Lua,而是在 PDF 轮廓中给出实际的西装符号而不是 T:
\documentclass[a4paper, 11pt, twoside, onecolumn, dvipsnames, final]{memoir}%
\RequirePackage[scale=0.8]{fdsymbol}%
\RequirePackage{fontspec}%
\RequirePackage{unicode-math}%
% I am not rich enough for these fonts
% \setmainfont[Numbers={OldStyle,Proportional},Ligatures=TeX,Scale=MatchLowercase,Renderer=Basic]{Minion Pro}%
% \newfontfamily\MinionProportional[Ligatures=TeX, Ligatures=Common,Numbers=Monospaced]{Minion Pro}%
\setmathfont{Asana Math}%
\newcommand{\Ts}{\ensuremath{\clubsuit}}%
\usepackage{luacode}
\RequirePackage[unicode=true,
psdextra,
colorlinks=true,
citecolor=DarkBlue,
filecolor=DarkBlue,
linkcolor=DarkBlue,
urlcolor=DarkBlue,
hyperfootnotes=false,
linktoc=all]{hyperref}%
\pdfstringdefDisableCommands{%
\renewcommand\Ts{\Uchar"2663 }%
% Inside PDF strings, \Ts is replaced by Unicode char U+2663 "BLACK CLUB SUIT"
}
\begin{document}
\chapter{Chapter the first}
\section{Opening 1\Ts : The Walsh treatment}
\end{document}
答案2
使用 fontspec
此解决方案使用文本字体而不是数学模式符号。这四个符号存在于多种字体中,但有一个免费的、特别全面的字体系列是 DejaVu 字体。它不会更改任何主字体,而是将符号缩放到您选择的任何字体。
\documentclass[varwidth, preview]{standalone}
\usepackage{fontspec}
\usepackage{polyglossia}
\setdefaultlanguage{french}
%% \setmainfont goes here.
\defaultfontfeatures{Scale=MatchUppercase}
\newfontfamily\symbolfamily{DejaVu Serif}
\DeclareRobustCommand\Ts{{\symbolfamily\char"2663}\relax}
\begin{document}
\textbf{Réponses à l'ouverture de 1\Ts : Le traitement Walsh} \\
\end{document}
这是一个包含 Marcel Kruger 答案的部分版本,以便在 Hyperref 中正确设置您的 PDF 文档大纲:
\documentclass[varwidth, preview]{standalone}
\usepackage{fontspec}
\usepackage{polyglossia}
\usepackage[HTML, hyperref, svgnames]{xcolor}
\usepackage[ bookmarks, unicode, colorlinks, allcolors=DarkBlue
]{hyperref}
\setdefaultlanguage{french}
%% \setmainfont goes here.
\defaultfontfeatures{Scale=MatchUppercase}
\newfontfamily\symbolfamily{DejaVu Serif}
\DeclareRobustCommand\Ts{{\symbolfamily\char"2663}\relax}
\pdfstringdefDisableCommands{%
\renewcommand\Ts{\Uchar"2663\relax}%
% Inside PDF strings, \Ts is replaced by Unicode char U+2663 "BLACK CLUB SUIT"
}
\begin{document}
\section{Réponses à l'ouverture de 1\Ts : Le traitement Walsh}\label{sec:1}
\end{document}
使用旧式编码
如果你必须使用较旧的工具链,则套装符号也可在pifont
包中使用。你可以在psnfss 文档。
\documentclass[varwidth, preview]{standalone}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage[utf8]{inputenc} % The default since 2018.
\usepackage[french]{babel}
\usepackage{pifont}
\DeclareRobustCommand\Ts{\ding{168}\relax}
\begin{document}
\textbf{Réponses à l'ouverture de 1\Ts : Le traitement Walsh} \\
\end{document}
相同的hyperref
代码仍然可以使用。