我想制作一个三行的直行文本,其中顶行是数字和星号,中间是希腊语,底行是白话文(葡萄牙语)。示例如下:
据我所知,挑战在于让 TeX 宏直接以所需形状生成 pdf。每个单词都应是三层分数。这些分数状的单词必须通过单词间距或标点符号(逗号等)连接,并在每行可用的空间内对齐。我必须用两种语言输入,这建议我使用 polyglossia TeX 包。这是我的极限。剩下的就交给你们了,我的助手们。
答案1
使用 ExPeX 进行行间注释
正如我所提到的我之前的回答,我认为ExPex
软件包提供了很好的工具,可以满足您的需求,尽管输入内容并非如您描述的那样经过深思熟虑。ExPex 中自动注释的基本思想是,每行注释都单独输入,软件包使用空格排列每行注释中的部分内容,并使用括号来分隔组。
请参阅下文使用电子表格保持文本和数字对齐的解决方案。
这是您前两节诗句的示例(感谢 Morbusg 输入了第一节诗句!)。我还\section{}
使用该titlesec
包将一些诗句的格式添加为命令。
% !TEX TS-program = XeLaTeX
\documentclass[11pt]{book}
\usepackage[margin=1in]{geometry}
\usepackage{titlesec}
\usepackage{polyglossia}
\defaultfontfeatures{Ligatures=TeX}
\setmainlanguage{brazil}
\setotherlanguage[variant=ancient]{greek}
\setmainfont{Linux Libertine O}
\usepackage{expex}
\titleformat{\chapter}[display]
{\normalfont\filcenter}
{\LARGE\MakeUppercase{\chaptertitlename} \thechapter}
{1pc}
{\vspace{1pc}%
\LARGE}
\titlespacing{\chapter}
{0pt}{0pt}{10pt}
\titleformat{\section}[leftmargin]
{\normalfont
\vspace{0pt}%
\bfseries\Large\filleft}
{\thesection}{.5em}{}
\titlespacing{\section}
{4pc}{1.5ex plus .1ex minus .2ex}{0pt}
\renewcommand{\thesection}{\arabic{chapter}:\arabic{section}}
\lingset{glhangstyle=none}
\begin{document}
\setcounter{chapter}{1}
\chapter{O sonhou Nabucodonsor}
\section{}
\begingl
\gla 1722--3588 2094 3588 1208 3588 392 * 1797 *
1798 2532 1839 3588 4151--1473 {} 2532 3588 5258--1473 1096--575--1473//
\glb {εν τω} έτει τω δευτέρω της βασιλείας Ναβουχοδονόσορ ενυπνιάσθη Ναβουχοδονόσορ
ενύπνιον και εξέστη το πνεύμα αυτού και ο {ύπνος αυτού} {εγένετο απ 'αυτού}//
\glc No ano {} segundo do reinado {de Nabucodonosor} sonhou Nabucodonsor
{um sonho,} e desconcertou-se o espirito dele, e o {sono dele} {se lhe fugiu.}//
\endgl
\section{}
\begingl
\gla 2532 2036 3588 935 2564 3588 1883.3 2532 3588 3097 2532
3588 5333 2532 3588 * 3588 312 3588 935
3588 1798--1473 2532 2064 2532 2476 1799 3588 935//
\glb και είπεν ο βασιλεύς καλέσαι τονς επαοιδούς και τονς μάγους και
τονς φαρμακούς και τονς Χαλδαίούς τον αναγγείλαι τω βασιλεί
τα {ενύπνια αυτού} και ήλθον και έστησαν ενώπιον του βασιλεύς //
\glc E mandou o rei chamar os encantadores, e os magos, e
os {ministradores de poções,} e os Caldeus, para anunciar ao rei
{as \emph{coisas}} {dos sonhos dele.} e vieram E {postaram-se} diante
de rei//
\endgl
\end{document}
用于datatool
管理平行文本
这里发布的所有解决方案的最大问题是管理编号行、希腊语行和翻译行之间的关系。在上述解决方案中,输入文本更易读,但很难发现输入中的错误。在 Yiannis 和 Morbusg 的解决方案中,输入非常繁琐,并且文本本身在源文档中不可读。以下是针对这两个问题的解决方案的尝试。想法是将并行文本保存在 CSV 文件中,然后datatool
结合使用包和 ExPex 来构建文本。
CSV 文件的格式
CSV 文件包含 3 列:数字、希腊语和葡萄牙语。因此,每行由一个数字、一个希腊语单词(或多个单词)及其翻译的三元组组成。每节经文都由数字列中的关键字(因为经文在文档中section
是s)分隔。\section
由于输入行的构建方式,CSV 文件中的空格、* 和空单元格需要进行转义。我们使用以下标记来执行此操作:
space = \space
empty cell = \null
* = \esc{*}
示例 CSV 文件
这是与上例相同的文本的 CSV 文件。此文件使用 Open Office 创建,并以 UTF-8 格式保存,使用 TAB 作为分隔符。我们不能使用它,
作为分隔符,因为我们需要在文本中使用标点符号。
Chapter2.csv
"Number" "Greek" "Portuguese"
"section"
"1722--3588" "{εν\space τω}" "No"
"2094" "έτει" "ano"
"3588" "τω" "\null"
"1208" "δευτέρω" "segundo"
"3588" "της" "do"
"392" "βασιλείας" "reinado"
"\esc{*}" "Ναβουχοδονόσορ" "{de\space Nabucodonosor}"
"1797" "ενυπνιάσθη" "sonhou"
"\esc{*}" "Ναβουχοδονόσορ" "Nabucodonsor"
"1798" "ενύπνιον" "{um\space sonho,}"
"2532" "και" "e"
"1839" "εξέστη" "desconcertou-se"
"3588" "το" "o"
"4151--1473" "πνεύμα" "espirito"
"\esc{\null}" "αυτού" "dele,"
"2532" "και" "e"
"3588" "ο" "o"
"5258--1473" "{ύπνος\space αυτού}" "{sono\space dele}"
"1096--575--1473" "{εγένετο\space απ\space 'αυτού}" "{se\space lhe\space fugiu.}"
"section"
"2532" "και" "E"
"2036" "είπεν" "mandou"
"3588" "ο" "o"
"935" "βασιλεύς" "rei"
"2564" "καλέσαι" "chamar"
"3588" "τονς" "os"
"1883.3" "επαοιδούς" "encantadores,"
"2532" "και" "e"
"3588" "τονς" "os"
"3097" "μάγους" "magos,"
"2532" "και" "e"
"3588" "τονς" "os"
"5333" "φαρμακούς" "{ministradores\space de\space poções,}"
"2532" "και" "e"
"3588" "τονς" "os"
"\esc{*}" "Χαλδαίούς" "Caldeus,"
"3588" "τον" "para"
"312" "αναγγείλαι" "anunciar"
"3588" "τω" "ao"
"935" "βασιλεί" "rei"
"3588" "τα" "{as\space \emph{coisas}}"
"1798--1473" "{ενύπνια\space αυτού}" "{dos\space sonhos\space dele.}"
"2532" "και" "e"
"2064" "ήλθον" "vieram"
"2532" "και" "E"
"2476" "έστησαν" "{postaram-se}"
"1799" "ενώπιον" "diante"
"3588" "του" "de"
"935" "βασιλεύς" "rei."
文档代码
以下是读取 CSV 文件并生成输出的文档:
% !TEX TS-program = XeLaTeX
\documentclass[11pt]{book}
\usepackage[margin=1in]{geometry}
\usepackage{titlesec}
\usepackage{polyglossia}
\defaultfontfeatures{Ligatures=TeX}
\setmainlanguage{brazil}
\setotherlanguage[variant=ancient]{greek}
\setmainfont{Linux Libertine O}
\usepackage{datatool}
\usepackage{expex}
% Format chapter and verse (\section) headings
\titleformat{\chapter}[display]
{\normalfont\filcenter}
{\LARGE\MakeUppercase{\chaptertitlename} \thechapter}
{1pc}
{\vspace{1pc}%
\LARGE}
\titlespacing{\chapter}
{0pt}{0pt}{10pt}
\titleformat{\section}[leftmargin]
{\normalfont
\vspace{0pt}%
\bfseries\Large\filleft}
{\thesection}{.5em}{}
\titlespacing{\section}
{4pc}{1.5ex plus .1ex minus .2ex}{0pt}
% format section label
\renewcommand{\thesection}{\arabic{chapter}:\arabic{section}}
% multiple gloss lines will align on the left margin
\lingset{glhangstyle=none}
% initialize some token registers to build up the lines from the database cells
\newtoks\glosslineA
\newtoks\glosslineB
\newtoks\glosslineC
% create a command to append a cell to the token register
% Thanks to Enrico Gregorio for this code
\long\def\Append#1#2{#1=\expandafter{%
\the\expandafter\expandafter\expandafter#1\expandafter\space #2}}
% Define a command to empty the token registers
\def\emptytoks{\glosslineA{}\glosslineB{}\glosslineC{}}
% Define a command used to escape * in the input cell
\def\esc#1{#1} %
\def\SecTest{section} % verse delimiter check
\begin{document}
\DTLsetseparator{ }% literal tab; with UTF8 source, \DTLsettabseparator doesn't work
\DTLloaddb{text}{Chapter2.csv}
\setcounter{chapter}{1}
\chapter{O sonhou do Nabucodonsor}
\DTLforeach{text}
{% assign each cell in a row to a macro
\Codes=Number,
\GreekText=Greek,
\PortugueseText=Portuguese%
}
{% If we're in the first row, start a section; otherwise if we find a section, output
% the previous section's lines, and start a new section, then empty the token registers
\DTLiffirstrow{\section{}}{
\DTLifeq{\Codes}{\SecTest}{
\begingl
\expandafter\gla\the\glosslineA//
\expandafter\glb\the\glosslineB//
\expandafter\glc\the\glosslineC//
\endgl
\section{}
\emptytoks
}
{% For each cell, append it to the token register for that line
\Append\glosslineA{\Codes}%
\Append\glosslineB{\GreekText}%
\Append\glosslineC{\PortugueseText}%
}}}
% output the last section's lines.
\begingl
\expandafter\gla\the\glosslineA//
\expandafter\glb\the\glosslineB//
\expandafter\glc\the\glosslineC//
\endgl
\end{document}
两种解决方案的输出
答案2
我建议您从下面所示的最小值开始。您必须逐行输入所有三个“单词”。我使用“|”作为分隔符,并使用“;”结束宏,因为我觉得这样更容易捕获输入。
\documentclass{article}
\usepackage[polutonikogreek, english]{babel}
\fboxrule0pt
\fboxsep1pt
\parindent0pt
\begin{document}
\def\add#1|#2|#3;{\fbox{\vbox{\hbox{#1}\hbox{#2}\hbox{#3}}}}
\def\addsection#1{\fbox{\vbox to 1.1cm{\vfill\hbox to 1cm{\hfill\Large\bfseries #1}\vfill}}}
\addsection{2.1}
\add 1722-3588| en tw| No;
\add 1722-3588| en tw| No;
\add 1722-3588| en tw| No;
\add 1722-3588| en tw| No;
\add 1722-3588| en tw| No;
\add 1722-3588| en tw| No;
\add 1722-3588| en tw| No;
\add 1722-3588| en tw| No;
\add 1722-3588| en tw| No;
\add 1722-3588| en tw| No;
\add 1722-3588| en tw| No;
\add 1722-3588| en tw| No;
\add 932 | Basilia Nabu| de Nabu;
\end{document}
请试用并传递一些反馈以改进外观和用户界面。如果为希腊文本着色,可读性将提高一个数量级。如果您需要,请添加评论;我正在寻找改进界面的评论。
答案3
输入起来不是很愉快,但是这里有一个使用纯 XeTeX 的想法:
\font\greek="GFS Olga" % http://www.greekfontsociety.gr/pages/en_typefaces20th.html
\font\portuguese="TeX Gyre Pagella:mapping=tex-text" % http://www.gust.org.pl/projects/e-foundry/tex-gyre/pagella
\font\bold="TeX Gyre Pagella/B" at 20pt
\fontdimen3\portuguese=1em % let interword space stretch a lot
\baselineskip=40pt % 3*10pt = 30pt, with lead ~3.3333pt 3*13.3333pt ~ 40pt
\def\ngp#1#2#3{%
$\vcenter{\hbox{%
\valign{\hbox{\strut##}&
\hbox{\strut\greek##}&
\hbox{\strut\portuguese##}\cr% it already is the portuguese font, I
% just wanted to show how you could
% change the last row
#1\cr}}}$}
\portuguese
{\bold 2:1}
\ngp{1722--3588}{εν τω}{No}
\ngp{2094}{έτει}{ano}
\ngp{3588}{τω}{}
\ngp{1208}{δευτέρω}{segundo}
\ngp{3588}{της}{do}
\ngp{392}{βασιλείας}{reinado}
\ngp{*}{Ναβουχοδονόσορ}{de Nabucodonosor}
\ngp{1797}{ενυπνιάσθη}{sonhou}
\ngp{*}{Ναβουχοδονόσορ}{Nabucodonsor}
\ngp{1798}{ενύπνιον}{um sonho,}
\ngp{2532}{και}{e}
\ngp{1839}{εξέστη}{desconcertou-se}
\ngp{3588}{το}{o}
\ngp{4151--1473}{πνεύμα αυτού}{espirito dele,}
\ngp{2532}{και}{e}
\ngp{3588}{ο}{o}
\ngp{5258--1473}{ύπνος αυτού}{sono dele}
\ngp{1096--575--1473}{εγένετο απ 'αυτού}{se lhe fugiu.}
{\bold 2:2}
\ngp{2532}{και}{E}
\ngp{2036}{είπεν}{mandou}
\bye
答案4
使用 expl3 - 演示
相同的希腊文本,三次,可以使事情保持同步。
第一行,在属性列表中查找每个单词作为键,以找到强引用号作为值,并用该值替换(εν=G1722
)。
第二行,保持希腊文。
εν=in
第三行,通过第二个属性列表查找逐字(文字)的注释/翻译( )。
这项工作正在获得 Strong 的在线版本和翻译记忆库(可能两种情况下都是电子表格)。
几乎 MWE
\documentclass{article}
\usepackage{xcolor}
\usepackage{fontspec}
\setmainfont{Noto Serif}
\setsansfont{Noto Sans}
\setmonofont{Noto Sans Mono}
\usepackage{xparse}
\usepackage{gb4e}
\noautomath
\usepackage{xurl}
\newcommand\surl[1]{{\footnotesize\noindent Source Reference}\\\url{#1}}
%=======================
\usepackage{polyglossia}
\setmainlanguage{english}
\setotherlanguage[variant=ancient]{greek}
\newfontfamily\greekfont[Script=Greek,Renderer=HarfBuzz]{Noto Serif}%{Linux Libertine O}
\newcommand\pkvstrong[1]{\mfsgetapropkv{strong}{#1}}
\newcommand\pkvnabeng[1]{\mfsgetapropkv{nabeng}{#1}}
\newcommand\pkvtest[1]{\fbox{#1}}
\ExplSyntaxOn
... Too many characters for a 30k-character answer box.
\ExplSyntaxOff
\begin{document}
%
%ενG1722 In τωG3588 the έτειG2094 year τωG3588 δευτέρωG1208 second τηςG3588 of the βασιλείαςG932 kingdom Ναβουχοδονόσορ of Nebuchadnezzar, ενυπνιάσθηG1797 dreamed Ναβουχοδονόσορ Nebuchadnezzar ενύπνιονG1798 a dream, καιG2532 and εξέστηG1839 was startled τοG3588 πνεύμα αυτούG4151 his spirit, καιG2532 and οG3588 ύπνος αυτούG5258 his sleep εγένετοG1096 went απ΄G575 from αυτούG1473 him.
%
%\surl{http://biblia-online.pl/Biblia/Septuaginta/Ksiega-Daniela/2/1}
\mfsloadaseql{nab}{*/}{%
εν τω έτει τω δευτέρω της βασιλείας Ναβουχοδονόσορ ενυπνιάσθη Ναβουχοδονόσορ ενύπνιον και εξέστη το πνεύμα αυτού και ο ύπνος αυτού εγένετο απ΄ αυτού
}
\mfsloadaprop{strong}{%
εν=G1722
,τω=G3588
,έτει=G2094
%,τω=G3588
,δευτέρω=G1208
,της=G3588
,βασιλείας=G932
,Ναβουχοδονόσορ=*
,ενυπνιάσθη=G1797
%,Ναβουχοδονόσορ=*
,ενύπνιον=G1798
,και=G2532
,εξέστη=G1839
,το=G3588
,πνεύμα=G4151
,αυτού=G1473
%,και=G2532
,ο=G3588
,ύπνος=G5258
%,αυτού=G1473
,εγένετο=G1096
,απ΄=G575
%,αυτού=G1473
,test=Y9999
}
\mfsloadaprop{nabeng}{%
εν=in
,τω=the
,έτει=year
%,τω=G3588
,δευτέρω=second
,της=of-the
,βασιλείας=reign
,Ναβουχοδονόσορ=Nebuchadnezzar
,ενυπνιάσθη=dreamed
%,Ναβουχοδονόσορ
% Nebuchadnezzar
,ενύπνιον=a-dream
,και=and
,εξέστη=was-startled
,το=the
,πνεύμα=spirit
,αυτού=his
%,και=G2532
% and
,ο=the
,ύπνος=sleep
%,αυτού=G5258
% his sleep
,εγένετο=went
,απ΄=from
%,αυτού=G1473
% him.
,test=X9999
}
\glsetfirstlineformat{\footnotesize\ttfamily}
\glsetsecondlineformat{\selectlanguage{greek}\color{blue}{\vrule height 12pt depth 6pt width 0pt}}
\glsetthirdlineformat{\small}
\mfsformattedvboxon
\begin{exe}
\ex
\glinlines[addca=pkvstrong,addcc=pkvnabeng]{%
εν τω έτει τω δευτέρω της βασιλείας Ναβουχοδονόσορ ενυπνιάσθη Ναβουχοδονόσορ ενύπνιον και εξέστη το πνεύμα αυτού και ο ύπνος αυτού εγένετο απ΄ αυτού
*/ εν τω έτει τω δευτέρω της βασιλείας Ναβουχοδονόσορ ενυπνιάσθη Ναβουχοδονόσορ ενύπνιον και εξέστη το πνεύμα αυτού και ο ύπνος αυτού εγένετο απ΄ αυτού
*/ εν τω έτει τω δευτέρω της βασιλείας Ναβουχοδονόσορ ενυπνιάσθη Ναβουχοδονόσορ ενύπνιον και εξέστη το πνεύμα αυτού και ο ύπνος αυτού εγένετο απ΄ αυτού
}
\end{exe}
\surl{http://biblia-online.pl/Biblia/Septuaginta/Ksiega-Daniela/2/1}
Text adapted slightly
\end{document}
代码太长,8k 个字符,不适合此处。实际 MWE 为https://github.com/texcicada/expl3/blob/main/glosser3a-nab.tex和https://github.com/texcicada/expl3/blob/main/glosser3a-nab.pdf
完整版宏\glinlines
,正在进行中,位于https://github.com/texcicada/expl3/blob/main/glosser3a.tex和https://github.com/texcicada/expl3/blob/main/glosser3a.pdf