
Я использую XeLaTeX
с fontspec
, polyglossia
, biblatex
и hyperref
пакетами (и т. д.) для набора документов как \documentclass[11pt,a4paper]{article}
. hyperref
Пакет просто потрясающий, однако я обнаружил действительно раздражающую ошибку.
Я хочу pdftitle
использовать комбинацию некоторого статического текста и ранее определенной переменной \thetitle
. Пока все хорошо. Проблема возникает, когда эта переменная содержит переносы строк ( \\
). hyperref
похоже, просто автоматически их пропускает, но я хочу иметь возможность контролировать это вручную.
Чтобы избавиться от переносов строк, я использую этот макрос \replacelinebreaks{}{}
:
% A macro to remove line breaks from any text #1 and replace them
% with #2 (can be void). E.g.: \replacelinebreaks{\thetitle}{\ }.
\newcommand{\replacelinebreaks}[2]{%
\begingroup\def\\{#2}#1\endgroup}
(В этом заслуга прежде всегоПростой способ удалить форматирование (например, переносы строк).) Этот макрос отлично работает во всем документе, за исключением \hypersetup{pdftitle= ...}
.
Что я упускаю? На этом сайте довольно много очень похожих вопросов, но ни один из них, похоже, не решает мою конкретную проблему:
- Использование не-ASCII символов в именах авторов и заголовках в hyperref pdfinfo, но я уже использую
\hypersetup
- Я также пробовал создать новую переменную без переносов строк, но ошибка, похоже, распространяется по всему тексту.
- Использование кода для специальных символов (например,
\040
должен быть пробел) не приводит к какой-либо разнице.
- hyperref: pdftitle и неправильная кодировка символов, тот же аргумент.
- pdfinfo, похоже, не работает, снова тот же аргумент.
- hyperref: разрыв длинных строк в pdftitle и других полях.
\textLF
и\textCR
не решают мою проблему. Foxit Reader не распознает эти символы, а Adobe Acrobat и Acrobat Reader отображают только первую строку. Моя проблема связана сhyperref
. - Символы, не входящие в ASCII, не отображаются в pdftitle гиперрефа: ошибка в опции «unicode»?. В моем случае
\usepackage[pdfencoding=unicode]{hyperref}
ничего не меняет. - Заставить hyperref брать pdfinfo из \title и \author. Конечно, если я использую
\usepackage[pdfusetitle]{hyperref}
is\hypersetup
устарело и переносы строк автоматически преобразуются в пробел (для pdftitle) и в запятую (для pdfauthor). Однако, как было отмечено ранее, мне нужна комбинация статического текста и\thetitle
, поэтому\hypersetup
is неизбежно.- Такой
\@title
подход не поможет, поскольку он уже используется для определения\thetitle
в первую очередь.
- Такой
Вот мой MWE:
% !BIB TS-program = biber
% !TeX program = xelatex
% !TeX encoding = UTF-8
% !TeX spellcheck = en_GB
\documentclass[11pt,a4paper]{article}
\usepackage{polyglossia}
\usepackage{hyperref}
\newcommand{\replacelinebreaks}[2]{\begingroup\def\\{#2}#1\endgroup}
\def\thetitle{Type the\\Minimum Working Example\\Title Here\\}
\def\firstauthor{Abra} % Only the first author
\def\theauthor{\firstauthor % Add all other authors (no spaces! Use "\\" and "%")
\\Ca%
\\Dabra%
}
\begin{document}
\hypersetup{
pdftitle = MWE No.1 \space -- \replacelinebreaks{\thetitle}{\ },
pdfauthor = \replacelinebreaks{\theauthor}{; },
}
\begin{center}
{\Huge\thetitle}
\end{center}
\end{document}
В результате получается:
Пожалуйста, помогите мне понять и исправить это поведение, чтобы я мог либо использовать свой \replacelinebreaks
макрос, либо достичь своей цели каким-то другим способом. Ваша помощь очень ценится.
решение1
Вы всегда можете переопределить способ обработки таких токенов hyperref:
\documentclass{article}
\usepackage{hyperref}
\newcommand\myvar{abc\\cde}
\pdfstringdefDisableCommands{\def\\{XXX}}
\hypersetup{pdftitle= abc\\ cde\myvar}
\begin{document}
blub
\end{document}
Или вы можете определить свою переменную так, чтобы она использовалась в разумных местах \texorpdfstring
:
\documentclass{article}
\usepackage{hyperref}
\newcommand\myvar{abc\texorpdfstring{\\}{XXX}cde}
\hypersetup{pdftitle= abcXXXcde\myvar}
\begin{document}
\myvar
\end{document}