使用 fontspec

使用 fontspec

我的回忆录章节标题包含法语重音字符和一些花色符号(例如 \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}

DejaVu Serif 中的 ੧

这是一个包含 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}

使用 pifont 进行采样

相同的hyperref代码仍然可以使用。

相关内容