PdfLaTeX 的 \write 到使用 utf8 的西里尔文文件中会产生不需要的 \cyr

PdfLaTeX 的 \write 到使用 utf8 的西里尔文文件中会产生不需要的 \cyr

谢谢埃格尔,我有可能将作者姓名写入\authblk文件以供后续使用。

\documentclass[twocolumn, oneside]{article} 
\usepackage[utf8]{inputenc} 
\usepackage[english, ukrainian]{babel}
\usepackage{authblk} 
\pagestyle{empty}
\setcounter{Maxaffil}{0}
\renewcommand\Authsep{, }
\renewcommand\Authand{, }
\renewcommand\Authands{, }
\renewcommand\Authfont{\small}
\renewcommand\Affilfont{\itshape\small}
%-------------------------------------------------------------------
\makeatletter
\newwrite\titleauthorfile
\newcommand\writedatatofile[1]{%
  \immediate\openout\titleauthorfile=#1.dat
  \immediate\write\titleauthorfile{%
     \string\thispapertitle{\unexpanded\expandafter{\@title}}}%
  \processauthors
  \immediate\write\titleauthorfile{\string\finishauthors}
  \immediate\closeout\titleauthorfile
}
\newcommand\processauthors{%
  \expandafter\process@authors\AB@authors\AB@setsep\protect\@nil
}
\def\process@authors#1\AB@setsep#2\protect#3\@nil{%
  \ifx\relax#2\relax
    \expandafter\@gobble
  \else
    \immediate\write\titleauthorfile{%
      \string\thispaperauthor{\unexpanded{#2}}%
    }
    \expandafter\@firstofone
  \fi
  {\process@authors#3\@nil}%
}

\makeatother
\selectlanguage{ukrainian} % Замість слова ukrainian введіть мову ваших тез
%----------------------------------------------------------
\title{Назва тез} % Замість слів Назва тез введіть назву ваших тез

%-------------------------------------------------------------------
\author[1]{А.В. Торперший} % Тут замість "Перший автор" ведіть ініціали та прідвище першого автора у вигляді А.В. Тор
\author[2]{А.В. Тордругий} % Тут замість "Перший автор" ведіть ініціали та прідвище першого автора у вигляді А.В. Тор
\author[1,2]{А.В. Тортретій}% Якщо  автор працює в кількох установах, то треба вводити номери установ через кому, наприклад 

%---Тут треба набирати назви установ, в яких працюють автори.
\affil[1]{Установа, в якій працює, або навчається перший автор} % Тут введіть в якій працює, або навчається перший автор
\affil[2]{Установа, в якій працює, або навчається другий автор} % Тут введіть в якій працює, або навчається другий автор



\writedatatofile{\jobname}
\begin{document}
\maketitle
\section*{Вступ}
Текст
\end{document}

输出.dat为:

\thispapertitle{Назва тез}
\thispaperauthor{\IeC {\CYRA }.\IeC {\CYRV }. \IeC {\CYRT }\IeC {\cyro }\IeC {\cyrr }\IeC {\cyrp }\IeC {\cyre }\IeC {\cyrr }\IeC {\cyrsh }\IeC {\cyri }\IeC {\cyrishrt }, \IeC {\CYRA }.\IeC {\CYRV }. \IeC {\CYRT }\IeC {\cyro }\IeC {\cyrr }\IeC {\cyrd }\IeC {\cyrr }\IeC {\cyru }\IeC {\cyrg }\IeC {\cyri }\IeC {\cyrishrt }}
\finishauthors

可以看到,该\thispapertitle记录具有正常的视图,但\thispaperauthor包含不需要的\CYR命令。问题是,为什么会发生这种情况?如何获取正常的文本?

答案1

如果您想继续使用,authblk您必须诉诸修补其\author宏,因为该策略的\AB@authors结果是将作者的名字扩展为\cyr...宏。

\documentclass[twocolumn, oneside]{article} 
\usepackage[utf8]{inputenc} 
\usepackage[english, ukrainian]{babel}
\usepackage{authblk}
\usepackage{xpatch}

\pagestyle{empty}
\setcounter{Maxaffil}{0}
\renewcommand\Authsep{, }
\renewcommand\Authand{, }
\renewcommand\Authands{, }
\renewcommand\Authfont{\small}
\renewcommand\Affilfont{\itshape\small}
%-------------------------------------------------------------------
\makeatletter

\xpretocmd{\author}{\save@author{#2}}{}{}
\newcommand\save@author[1]{%
  \gappto\saved@authors{#1}%
  \global\let\save@author\save@otherauthors
}
\newcommand{\save@otherauthors}[1]{\gappto\saved@authors{, #1}}

\newwrite\titleauthorfile
\newcommand\writedatatofile[1]{%
  \immediate\openout\titleauthorfile=#1.dat
  \immediate\write\titleauthorfile{%
     \string\thispapertitle{\unexpanded\expandafter{\@title}}}%
  \immediate\write\titleauthorfile{%
     \string\thispaperauthors{%
       \unexpanded\expandafter{\saved@authors}%
     }%
  }
  \immediate\closeout\titleauthorfile
}
\newcommand\processauthors{%
  \expandafter\process@authors\AB@authors\AB@setsep\protect\@nil
}
\def\process@authors#1\AB@setsep#2\protect#3\@nil{%
  \ifx\relax#2\relax
    \expandafter\@gobble
  \else
    \immediate\write\titleauthorfile{%
      \string\thispaperauthor{\unexpanded{#2}}%
    }
    \expandafter\@firstofone
  \fi
  {\process@authors#3\@nil}%
}

\makeatother
\selectlanguage{ukrainian} % Замість слова ukrainian введіть мову ваших тез
%----------------------------------------------------------
\title{Назва тез} % Замість слів Назва тез введіть назву ваших тез

%-------------------------------------------------------------------
\author[1]{А.В. Торперший} % Тут замість "Перший автор" ведіть ініціали та прідвище першого автора у вигляді А.В. Тор
\author[2]{А.В. Тордругий} % Тут замість "Перший автор" ведіть ініціали та прідвище першого автора у вигляді А.В. Тор
\author[1,2]{А.В. Тортретій}% Якщо  автор працює в кількох установах, то треба вводити номери установ через кому, наприклад 

%---Тут треба набирати назви установ, в яких працюють автори.
\affil[1]{Установа, в якій працює, або навчається перший автор} % Тут введіть в якій працює, або навчається перший автор
\affil[2]{Установа, в якій працює, або навчається другий автор} % Тут введіть в якій працює, або навчається другий автор

\writedatatofile{\jobname}
\begin{document}
\maketitle
\section*{Вступ}
Текст
\end{document}

第一个\author命令将名称添加到\saved@authors,然后重新定义为添加到的\save@author宏。, <author name>\saved@authors

.dat运行此文件后的内容是

\thispapertitle{Назва тез}
\thispaperauthors{А.В. Торперший, А.В. Тордругий, А.В. Тортретій}

答案2

该问题的解决方案如下: 作者姓名之间的分隔符(使用 LaTeX 内核编程)如何将完全展开的宏写入文件(使用 LaTeX 内核) 不幸的是,我不得不放弃使用这个authblk包。

完整示例:

\documentclass[]{article}
    \usepackage[T2A,T1]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage[english,russian,ukrainian]{babel}
    \usepackage{etoolbox}

\def\pacsprint{}
\def\keywordprint{}
\def\pacs#1{\def\pacsprint{\pacsname:\quad#1}}
\def\keywords#1{\def\keywordprint{{\itshape\keyname}:\quad#1}}

\makeatletter
    \patchcmd{\@maketitle}{\@title}{\bfseries\sffamily\MakeUppercase{\@title}}{}{}
    \patchcmd{\@maketitle}{\newpage}{\newpage\pacsprint\nopagebreak}{}{}
    \patchcmd{\@maketitle}{\large \@date}{\@affiliation}{}{}

\let\@authortofile\@empty
\def\@separator{\def\@separator{, }}% Delay comma once
\def\addauthor#1#2{%
  \g@addto@macro\@author{\@separator#1\textsuperscript{#2}}
  \g@addto@macro\@authortofile{\@separator#1}
}

\let\@affiliation\@empty
\def\affiliation#1#2{%
  \g@addto@macro\@affiliation{\par\textsuperscript{#2}{\itshape#1}\smallskip}
}
%---definition of newwrite as \writedatatofile---------
\newwrite\titleauthorfile
\newcommand\writedatatofile[1]{%
  \immediate\openout\titleauthorfile=#1.dat
  \immediate\write\titleauthorfile{%
     \string\thispapertitle{\unexpanded\expandafter{\@title}}}%
{%
\def\@separator##1\@separator##2{%
\unexpanded{##1}%
\ifx!##2%
\else
, \expandafter\@separator\expandafter##2%
\fi
}%
  \immediate\write\titleauthorfile{%
     \string\thispaperauthor{\@authortofile\@separator!}}%
}%
  \immediate\write\titleauthorfile{\string\finishauthors}%%%
  \immediate\closeout\titleauthorfile
}
\makeatother

\title{Title}
\addauthor{A. U. First}{1} 
\addauthor{А. U. Другий}{2} 
\addauthor{А. В. Третій}{1}
\addauthor{А. В. Четвертий}{1,2}%
%---Тут треба набирати назви установ, в яких працюють автори.
\affiliation{University/Department First}{1}
\affiliation{University/Department Second}{2} 
\begin{document}
\writedatatofile{\jobname}
\maketitle

\end{document}

.dat- 文件现在包含:

\thispapertitle{Title}
\thispaperauthor{A. U. First, А. U. Другий, А. В. Третій, А. В. Четвертий}
\finishauthors

在此处输入图片描述

相关内容