使用 ExPeX 进行行间注释

使用 ExPeX 进行行间注释

我想制作一个三行的直行文本,其中顶行是数字和星号,中间是希腊语,底行是白话文(葡萄牙语)。示例如下:

例子

据我所知,挑战在于让 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&#2&#3\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.texhttps://github.com/texcicada/expl3/blob/main/glosser3a-nab.pdf

完整版宏\glinlines,正在进行中,位于https://github.com/texcicada/expl3/blob/main/glosser3a.texhttps://github.com/texcicada/expl3/blob/main/glosser3a.pdf

相关内容