![创建多语言文档](https://linux22.com/image/334965/%E5%88%9B%E5%BB%BA%E5%A4%9A%E8%AF%AD%E8%A8%80%E6%96%87%E6%A1%A3.png)
我正在尝试用英语和法语编写一份文档(就像您在某些飞机上可以找到的文档一样)。我使用以下声明来使用babel
:
\usepackage[english,frenchb]{babel}
\babeltags{en = english}
\babeltags{fr = frenchb}
这对于段落和排版非常有用。
现在我还想添加标题(\sections
)。我遵循了之前的答案:https://tex.stackexchange.com/a/170963/27327。这允许创建 2 个不同的目录,但文档中只显示法语标题(所有\addetoc
内容均被忽略)。
那么有没有简单的方法来创建多语言文档?
我想要的是类似这样的东西:
目录页:
|------------------------+-------------------------|
| table of content | Table des matieres |
|------------------------+-------------------------|
| Fist section 3 | Première section 3 |
| Second section 10 | Deuxième section 10 |
| ... | ... |
| | |
|------------------------+-------------------------|
在\section
页面上:
|--------------------------------------------------|
| First Section - Première Section 3 |
|--------------------------------------------------|
| Text in English |
| |
|--------------------------------------------------|
| Text in French |
| |
|--------------------------------------------------|
我唯一缺少的是:
- 如何用多种语言显示某一部分
- 如何在同一页面中显示两列目录(每种语言一列)
提前致谢。
答案1
也许是这样的?(警告,章节标题没有正确换行!)
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english,frenchb]{babel}
\babeltags{en = english}
\babeltags{fr = frenchb}
\usepackage{xpatch}
\usepackage{xparse}
\usepackage{blindtext}
\usepackage{parcolumns}
\makeatletter
\patchcmd{\pc@placeboxes}{\vrule}{{\VRULE}}{}{}
\newcommand\VRULE{\color{SOME_COLOR}\vrule width 0.2mm}
\def\@sect#1#2#3#4#5#6[#7]#8{%
\ifnum #2>\c@secnumdepth
\let\@svsec\@empty
\else
\refstepcounter{#1}%
\protected@edef\@svsec{\@seccntformat{#1}\relax}%
\fi
\@tempskipa #5\relax
\ifdim \@tempskipa>\z@
\begingroup
#6{%
\@hangfrom{\hskip #3\relax}%\@svsec}
\interlinepenalty \@M #8 \hfill\thepage\@@par}%
\endgroup
\csname #1mark\endcsname{#7}%
\addcontentsline{toc}{#1}{%
\ifnum #2>\c@secnumdepth \else
\protect\numberline{\csname the#1\endcsname}%
\fi
#7}%
\else
\def\@svsechd{%
#6{\hskip #3\relax
\@svsec #8}%
\csname #1mark\endcsname{#7}%
\addcontentsline{toc}{#1}{%
\ifnum #2>\c@secnumdepth \else
\protect\numberline{\csname the#1\endcsname}%
\fi
#7}}%
\fi
\@xsect{#5}}
\let\latex@@section\section
\RenewDocumentCommand{\section}{somo}{%
\IfBooleanTF{#1}{%
\latex@@section*{#3}%
}{%
\def\@temp@@a{#3}
\IfValueT{#4}{%
\xdef\@temp@@a{#3 -- #4}
}
\IfValueTF{#2}{%
\latex@@section[#2]{\@temp@@a}%
}{%
\latex@@section[#3]{\@temp@@a}
}%
\IfValueT{#4}{%
\addcontentsline{ftoc}{section}{\protect\numberline{\csname thesection\endcsname}#4}
}%
}%
}
\renewcommand\tableofcontents[1][toc]{%
\section*{\contentsname
\@mkboth{%
\MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
\@starttoc{#1}%
}
\makeatother
\begin{document}
\begin{parcolumns}[nofirstindent,rulebetween=true]{2}
\colchunk{%
\selectlanguage{english}
\tableofcontents
}
\colchunk{%
\selectlanguage{french}
\tableofcontents[ftoc]
}
\end{parcolumns}
\pagebreak
\section{First section}[Première Section]
\selectlanguage{english}
\blindtext
\selectlanguage{frenchb}
\blindtext
\section{Second Section}[Deuxième Section]
\selectlanguage{english}
\blindtext
\selectlanguage{frenchb}
\blindtext
\end{document}
答案2
使用以下宏可以帮我完成这项工作:
\newlength{\sect@@width}
\usepackage{calc}
\newcommand\mlsection[2]{%
\refstepcounter{section}
\begingroup
\def\temp@@a{\noindent{#1}\hfill{#1}}
\setlength{\sect@@width}{\widthof{\temp@@a}}
\ifdim \sect@@width>\textwidth
\noindent#1\newline
\noindent#2
\else
\temp@@a
\fi
\endgroup
\addcontentsline{toc}{section}{\protect\numberline{\csname thesection\endcsname}#1}
\addcontentsline{ftoc}{section}{\protect\numberline{\csname thesection\endcsname}#2}
}%
注意:这不是一个通用的解决方案,它处理章节编号(目录中除外)或格式化。
编辑:生成的 PDF 文档中的目录链接也不太好用。只toc
显示表格中的链接,ftoc
不显示链接。
EDIT2:我最终找到了一个简约的工作解决方案(没有 par skip、widow、club 等)但 PDF 文档中的链接有效:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english,frenchb]{babel}
\babeltags{en = english}
\babeltags{fr = frenchb}
\usepackage{xpatch}
\usepackage{xparse}
\usepackage{blindtext}
\usepackage{parcolumns}
\usepackage{bookmark}
\makeatletter
\usepackage{printlen}
\newlength{\sect@@width}
\usepackage{calc}
\newcommand\@mlsection[4]{%
\refstepcounter{section}%
\begingroup%
\currentpdfbookmark{#1}{section.\csname thesection\endcsname}%
\currentpdfbookmark{#2}{section.\csname thesection\endcsname}%
\vspace{1em}%
\def\temp@@a{\LARGE\noindent{#3}\hfill{#4}}%
\setlength{\sect@@width}{\widthof{\temp@@a}}%
\ifdim \sect@@width>\textwidth%
\noindent\LARGE#3\newline%
\noindent\LARGE#4%
\else%
\temp@@a%
\fi%
\newline
\endgroup%
\addcontentsline{entoc}{section}{\protect\numberline{\csname thesection\endcsname}#1}%
\addcontentsline{frtoc}{section}{\protect\numberline{\csname thesection\endcsname}#2}%
}%
\newcommand\mlsection[2]{%
\begingroup%
\@mlsection{#1}{#2}{\selectlanguage{english}#1}{\selectlanguage{frenchb}#2}%
\endgroup%
}%
\renewcommand\tableofcontents[1][toc]{%
\section*{\contentsname
\@mkboth{%
\MakeUppercase\contentsname}{\MakeUppercase\contentsname}}%
\@starttoc{#1}%
}
\makeatother
\begin{document}
\begin{parcolumns}[nofirstindent,rulebetween=true]{2}
\colchunk{
\selectlanguage{frenchb}
\tableofcontents[frtoc]
%\shorttableofcontents{\contentsname}{1}
}
\colchunk{
\selectlanguage{english}
\tableofcontents[entoc]
}
\end{parcolumns}
\newpage
\mlsection{First section}{Première Section}
{\selectlanguage{english}\blindtext}
{\selectlanguage{frenchb}\blindtext}
\mlsection{Second Section}{Deuxième Section}
{\selectlanguage{english}\blindtext}
{\selectlanguage{frenchb}\blindtext}
\mlsection{Third Section}{Troisième Section}
{\selectlanguage{english}\blindtext}
{\selectlanguage{frenchb}\blindtext}
\mlsection{Fourth Section}{Quatrième Section}
{\selectlanguage{english}\blindtext}
{\selectlanguage{frenchb}\blindtext}
\end{document}
诀窍是使用toc
来生成锚点(section.N
)并\currentpdfbookmark
创建指向 的 PDF 链接section.N
。OTOH 同时创建entoc
并frtoc
显示双语内容表。