summaryrefslogtreecommitdiff
path: root/macros
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2023-06-27 03:00:56 +0000
committerNorbert Preining <norbert@preining.info>2023-06-27 03:00:56 +0000
commita0b68c12d9e67182560eb31f202f3e86f0e4a5de (patch)
tree5d0d249a669c45205fc467d62bd18d5edb2ae3ae /macros
parenta2ebe77da32f4499676953174f774795b0d054fb (diff)
CTAN sync 202306270300
Diffstat (limited to 'macros')
-rw-r--r--macros/latex/contrib/photobook/Makefile27
-rw-r--r--macros/latex/contrib/photobook/README.md52
-rw-r--r--macros/latex/contrib/photobook/photobook.cls206
-rw-r--r--macros/latex/contrib/photobook/photobook.pdfbin143897 -> 144078 bytes
-rw-r--r--macros/latex/contrib/photobook/scripts/make-spreads.sh12
-rw-r--r--macros/latex/required/babel/base/README.md30
-rw-r--r--macros/latex/required/babel/base/babel-code.pdfbin592226 -> 625101 bytes
-rw-r--r--macros/latex/required/babel/base/babel.dtx440
-rw-r--r--macros/latex/required/babel/base/babel.ins2
-rw-r--r--macros/latex/required/babel/base/babel.pdfbin399234 -> 404372 bytes
-rw-r--r--macros/latex/required/babel/base/bbcompat.dtx2
-rw-r--r--macros/plain/contrib/mlawriter/README46
-rw-r--r--macros/plain/contrib/mlawriter/mlawriter.tex68
-rw-r--r--macros/plain/contrib/mlawriter/testmla.pdfbin0 -> 28602 bytes
-rw-r--r--macros/plain/contrib/mlawriter/testmla.tex73
15 files changed, 787 insertions, 171 deletions
diff --git a/macros/latex/contrib/photobook/Makefile b/macros/latex/contrib/photobook/Makefile
index 769c5c2ac4..59b7ea002c 100644
--- a/macros/latex/contrib/photobook/Makefile
+++ b/macros/latex/contrib/photobook/Makefile
@@ -43,9 +43,6 @@
#----------------------------------------------------------------------
# Config...
-.EXPORT_ALL_VARIABLES:
-
-
# NOTE: this makes things run consistently on different systems including
# things like Android...
SHELL := bash
@@ -245,14 +242,10 @@ LN := cp -l
# list of dependencies...
#
-# NOTE: grep's -z flag generates a bunch if nulls that we need to clean
-# out via tr.
DEPENDS.txt: $(MODULE).cls
- cat $< \
- | grep -Ezo '\s*\\RequirePackage(\[[^]]*\])?\{[^}]*\}' \
- | sed -e 's/.*{\(.*\)}/hard \1\n/' \
- | grep -a hard \
- | tr -d '\000' \
+ make depends \
+ | grep -v make \
+ | sed -e 's/^/hard /' \
> $@
@@ -265,6 +258,20 @@ version:
@echo $(VERSION)
+# NOTE: grep's -z flag generates a bunch if nulls that we need to clean
+# out via tr.
+# XXX this is a bit ugly -- adding/removing "hard" and then adding it
+# again for DEPENDS.txt...
+.PHONY: depends
+depends: $(MODULE).cls
+ @cat $< \
+ | grep -Ezo '\s*\\RequirePackage(\[[^]]*\])?\{[^}]*\}' \
+ | sed -e 's/.*{\(.*\)}/hard \1\n/' \
+ | grep -a hard \
+ | tr -d '\000' \
+ | cut -d " " -f 2
+
+
#----------------------------------------------------------------------
# Main targets...
diff --git a/macros/latex/contrib/photobook/README.md b/macros/latex/contrib/photobook/README.md
index 004a438e86..54e29d5eba 100644
--- a/macros/latex/contrib/photobook/README.md
+++ b/macros/latex/contrib/photobook/README.md
@@ -4,27 +4,19 @@ photobook
[LaTeX](https://www.latex-project.org/) document class for making photo books.
-## Build requirements for docs
-
-- LaTeX tool chain (including: `lualatex`, `latexmk`, ..)
- The simplest way to get started is [TeX Live](https://www.tug.org/texlive/),
- either a full install or for specific modules see the _Packages_ section
- in [photobook.cls](./photobook.cls),
-- Un\*x-like environment (`bash`, GNU Make, coreutils, ...),
- on Windows systems, either [Cygwin](https://www.cygwin.com/) or
- [WSL/WSL2](https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux)
- should work fine.
-
+Available on:
+- CTAN: https://ctan.org/pkg/photobook
+- GitHub: https://github.com/flynx/photobook
-## Build / Install
+## Install / Build
-The package is available on:
-- CTAN: https://ctan.org/pkg/photobook
-- GitHub: https://github.com/flynx/photobook
+The simplest way to install is to use either
+[TeX Live](https://www.tug.org/texlive/)'s or [MiLTeX](https://miktex.org/)'s
+standard way to install modules.
-To install from source:
+Installing from source:
```shell
# get the source...
$ git clone https://github.com/flynx/photobook.git
@@ -34,14 +26,38 @@ $ cd ./photobook
$ make install
```
-If only building the docs is required without installing:
+The `photobook` document class requires a set of modules to be installed
+for it to function, the full list is included in the docs and can be
+printed by calling:
```shell
-$ make pdf
+$ make depends
```
For more info on `make` targets see the: [./Makefile](./Makefile)
+
+# Documentation
+
+Pre-built documentation can be found on
+[CTAN](http://mirrors.ctan.org/macros/latex/contrib/photobook/photobook.pdf)
+or it can be built from source by:
+```shell
+$ make pdf
+```
+
+Build requirements for docs:
+- LaTeX tool chain (including: `lualatex`, `latexmk`, ..)
+ The simplest way to get started is [TeX Live](https://www.tug.org/texlive/),
+ either a full install or for specific modules see the _Packages_ section
+ in [photobook.cls](./photobook.cls),
+- Un\*x-like environment (`bash`, GNU Make, coreutils, ...),
+ on Windows systems, either [Cygwin](https://www.cygwin.com/) or
+ [WSL/WSL2](https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux)
+ should work fine.
+
+
+
## Notes
- The main refetence is inline with the source [photobook.cls](./photobook.cls)
diff --git a/macros/latex/contrib/photobook/photobook.cls b/macros/latex/contrib/photobook/photobook.cls
index a0188d793b..d29c923dd3 100644
--- a/macros/latex/contrib/photobook/photobook.cls
+++ b/macros/latex/contrib/photobook/photobook.cls
@@ -38,10 +38,18 @@
%
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%
-% XXX should cliptocell offsets be tweakable???
-% XXX ASAP should cover/jacket/endpaper/spread template cells account
-% for bleeds as an option???
-% ...i.e. include cliptocell defaults???
+% XXX ASAP: imagecell: photobook@imagecell@left and photobook@imagecell@left
+% should explicitly account for clearence@left and clearence@top resp.
+% XXX ASAP: imagecell: clearance should have the same semantics as cliptocell
+% offsts...
+% (CLEARANCE)
+% XXX ASAP should cover/jacket/endpaper/spread cells set default cliptocell
+% bleeds???
+% ...needs testing and experimenting...
+% XXX ASAP: should \blockwidth include \bindingoffset (current) or not???
+% ...currently I think that no, as \blockwidth indicates the outer
+% width of the block, and this poses the question:
+% should \pagewidth include \bindingoffset???
% XXX ASAP should cover/jacket/endpaper/spread templates/cells account
% for \bindingoffset (likely no) and/or \gutteroffset ???
% ...especially relevant to endpaper/spread...
@@ -49,11 +57,11 @@
% ...all cells should ignore bleeds unless explicitly stated
% otherwise -- needs testing...
%
+%
% XXX captions behave in an odd way...
% the internal (macro) minipage for some reason does not affect text
% justification while adding a minipage in the macro argument works
% as expected -- some odd input mode???
-% XXX Q: should \blockwidth include \bindingoffset (current) or not???
% XXX revise \clearcaption / \captionclearpage...
% XXX unify API -- see CellContent env...
% XXX make this loadable both as a class and as a package...
@@ -85,8 +93,8 @@
%%% NOTE: \def\<module-name>@[A-Z]+ macros will be visible to both the
%%% code and the generated docs...
-\edef\photobook@FILEVERSION{v0.1.21}
-\edef\photobook@FILEDATE{2023-04-22}
+\edef\photobook@FILEVERSION{v0.1.23}
+\edef\photobook@FILEDATE{2023-05-05}
%% \documentclass{ltxdoc}
@@ -952,7 +960,13 @@
%% \DescribeMacro{\cellheight=<len>}
%% \DescribeMacro{\celloffsetleft=<len>}
%% \DescribeMacro{\celloffsettop=<len>}
-%% \DescribeMacro{\clearance=<len>}
+% XXX EXPERIMENTAL CLEARANCE
+%%% \DescribeMacro{\clearanceleft=<len>}
+%%% \DescribeMacro{\clearancetop=<len>}
+%%% \DescribeMacro{\clearanceright=<len>}
+%%% \DescribeMacro{\clearancebottom=<len>}
+% XXX LEGACY CLEARANCE
+%%% \DescribeMacro{\clearance=<len>}
%
%% Cell geometry.
%%
@@ -973,8 +987,19 @@
\setlength\celloffsetleft{0pt}
\newlength\celloffsettop
\setlength\celloffsettop{0pt}
-\newlength\clearance
-\setlength\clearance{0pt}
+% XXX EXPERIMENTAL CLEARANCE
+\newlength\clearanceleft
+\setlength\clearanceleft{0pt}
+\newlength\clearancetop
+\setlength\clearancetop{0pt}
+\newlength\clearanceright
+\setlength\clearanceright{0pt}
+\newlength\clearancebottom
+\setlength\clearancebottom{0pt}
+\def\clearances{0pt}
+% XXX LEGACY CLEARANCE
+%\newlength\clearance
+%\setlength\clearance{0pt}
%% \DescribeMacro{\clearfoldoutgutter=<len>}
@@ -1587,7 +1612,13 @@
%% \DescribeMacro{\cellparentheight=<len>}
%% \DescribeMacro{\celloffsettop=<len>}
%% \DescribeMacro{\celloffsetleft=<len>}
-%% \DescribeMacro{\clearance=<len>}
+% XXX EXPERIMENTAL CLEARANCE
+%%% \DescribeMacro{\clearanceleft=<len>}
+%%% \DescribeMacro{\clearancetop=<len>}
+%%% \DescribeMacro{\clearanceright=<len>}
+%%% \DescribeMacro{\clearancebottom=<len>}
+% XXX LEGACY CLEARANCE
+%%% \DescribeMacro{\clearance=<len>}
%%
%% A cell defines a set of contextual lengths:
%%
@@ -1719,7 +1750,13 @@
\setlength\cellheight{\photobook@protect@h}%
\setlength\celloffsettop{0pt}%
\setlength\celloffsetleft{0pt}%
- \setlength\clearance{0pt}%
+ % XXX EXPERIMENTAL CLEARANCE
+ \setlength\clearanceleft{0pt}%
+ \setlength\clearancetop{0pt}%
+ \setlength\clearanceright{0pt}%
+ \setlength\clearancebottom{0pt}%
+ % XXX LEGACY CLEARANCE
+ %\setlength\clearance{0pt}%
%
\begin{MinipageCellContent}[\photobook@minipagecell@parentvalign]{minipagecell}%
}{%
@@ -2009,6 +2046,7 @@
\setlength\photobook@cliptocell@right{0mm}%
\newlength\photobook@cliptocell@bottom
\setlength\photobook@cliptocell@bottom{0mm}%
+\def\cliptocellclearances{0mm 0mm 0mm 0mm}%
%% Set the default bleeds for |cliptocell| environments
%%
@@ -2019,9 +2057,13 @@
%% This will only affect |cliptocell| environments on the same level,
%% without affecting the nested |cliptocell|s.
%%
-% XXX should this set the setsepchar back to default???
-% XXX should this be public???
-% ...mainly due to setsepchar...
+%%% \DescribeEnv{cliptocellclearances=<left> <bottom> <right> <top>}
+%%%
+%%% Set by |\cliptocellbleeds{..}| and contains clearances (negative
+%%% clipping bleeds) usable by imagecell.
+%
+% XXX BUG: bleeds is set correctly for one value but 2 and 4 seem to be
+% misbehaving (see: ./examples/endpaper.tex)
\newcommand\cliptocellbleeds[1]{
\setsepchar{ }%
\readlist*\photobook@cliptocell@bleeds{#1}%
@@ -2055,7 +2097,13 @@
\setlength\photobook@cliptocell@right{%
\photobook@cliptocell@bleeds[3]}%
\setlength\photobook@cliptocell@top{%
- \photobook@cliptocell@bleeds[4]}\fi}
+ \photobook@cliptocell@bleeds[4]}\fi%
+ % NOTE: trailing spaces here are significant...
+ \def\cliptocellclearances{%
+ {-\photobook@cliptocell@left} %
+ {-\photobook@cliptocell@bottom} %
+ {-\photobook@cliptocell@right} %
+ {-\photobook@cliptocell@top}}}
\newenvironment{cliptocell}[1][0mm]{%
\begingroup%
@@ -2272,6 +2320,16 @@
\def\photobook@imagecell@captiontop{0pt}
\def\photobook@imagecell@captionleft{0pt}
+% XXX EXPERIMENTAL
+\newlength\photobook@imagecell@clearance@left
+\setlength\photobook@imagecell@clearance@left{0pt}
+\newlength\photobook@imagecell@clearance@top
+\setlength\photobook@imagecell@clearance@top{0pt}
+\newlength\photobook@imagecell@clearance@right
+\setlength\photobook@imagecell@clearance@right{0pt}
+\newlength\photobook@imagecell@clearance@bottom
+\setlength\photobook@imagecell@clearance@bottom{0pt}
+% XXX LEGACY
\newlength\photobook@imagecell@clearance
\setlength\photobook@imagecell@clearance{0pt}
@@ -2288,15 +2346,22 @@
\define@boolkey{imagecell@args}{center}[true]{%
\def\photobook@imagecell@top{\dimexpr
+0.5\cellheight
+ % XXX EXPERIMENTAL CLEARANCE -- test...
+ +0.5\photobook@imagecell@clearance@top
+ -0.5\photobook@imagecell@clearance@bottom
-0.5\ht\photobook@imagebox \relax}%
\def\photobook@imagecell@left{\dimexpr
+0.5\cellwidth
+ % XXX EXPERIMENTAL CLEARANCE -- test...
+ +0.5\photobook@imagecell@clearance@left
+ -0.5\photobook@imagecell@clearance@right
-0.5\wd\photobook@imagebox \relax}}%
% left/right...
% shortdands...
\newcommand\photobook@imagecell@LEFT{%
\def\photobook@imagecell@left{\dimexpr%
- +\photobook@imagecell@clearance \relax}%
+ +\photobook@imagecell@clearance@left \relax}%
+ %+\photobook@imagecell@clearance \relax}%
\def\photobook@imagecell@captionleft{
% XXX not sure why this branch is needed...
\ifKV@imagecell@args@fit
@@ -2304,12 +2369,14 @@
\else%
\dimexpr%
+\cellwidth
- -\photobook@imagecell@clearance
+ -\photobook@imagecell@clearance@left
+ %-\photobook@imagecell@clearance
-\wd\photobook@imagebox \relax\fi}}%
\newcommand\photobook@imagecell@RIGHT{%
\def\photobook@imagecell@left{\dimexpr
+\cellwidth
- -\photobook@imagecell@clearance
+ -\photobook@imagecell@clearance@right
+ %-\photobook@imagecell@clearance
-\wd\photobook@imagebox \relax}
% XXX not sure why 0.5 but it seems to work...
\def\photobook@imagecell@captionleft{%
@@ -2333,7 +2400,8 @@
% top/bottom...
\define@boolkey{imagecell@args}{top}[true]{%
\def\photobook@imagecell@top{%
- \photobook@imagecell@clearance}%
+ \photobook@imagecell@clearance@top}%
+ %\photobook@imagecell@clearance}%
\def\photobook@imagecell@captiontop{%
-\dimexpr
+\cellheight
@@ -2342,14 +2410,55 @@
\def\photobook@imagecell@top{%
\dimexpr
+\cellheight
- -\photobook@imagecell@clearance
+ -\photobook@imagecell@clearance@bottom
+ %-\photobook@imagecell@clearance
-\ht\photobook@imagebox \relax}%
\def\photobook@imagecell@captiontop{%
\dimexpr
\photobook@imagecell@top
- +\photobook@imagecell@clearance \relax}}%
+ +\photobook@imagecell@clearance@bottom \relax}}%
+ %+\photobook@imagecell@clearance \relax}}%
% clearance=<len>...
+% clearance=<horizontal> <vertical>...
+% clearance=<left> <bottom> <right> <top>...
\define@key{imagecell@args}{clearance}{%
+ % XXX EXPERIMENTAL
+ % XXX this is essentially the same as \photobook@cliptocell@bleeds -- unite...
+ \def\photobook@imagecell@clearances{#1}%
+ \setsepchar{ }
+ \readlist*\photobook@imagecell@clearencelist{#1}%
+ \setsepchar{,}%
+ %% args: size
+ \ifnum \photobook@imagecell@clearencelistlen = 1%
+ \setlength\photobook@imagecell@clearance@left{%
+ \photobook@imagecell@clearencelist[1]}%
+ \setlength\photobook@imagecell@clearance@bottom{%
+ \photobook@imagecell@clearencelist[1]}%
+ \setlength\photobook@imagecell@clearance@right{%
+ \photobook@imagecell@clearencelist[1]}%
+ \setlength\photobook@imagecell@clearance@top{%
+ \photobook@imagecell@clearencelist[1]}\fi%
+ % args: horizontal vertical
+ \ifnum \photobook@imagecell@clearencelistlen = 2%
+ \setlength\photobook@imagecell@clearance@left{%
+ \photobook@imagecell@clearencelist[1]}%
+ \setlength\photobook@imagecell@clearance@bottom{%
+ \photobook@imagecell@clearencelist[2]}%
+ \setlength\photobook@imagecell@clearance@right{%
+ \photobook@imagecell@clearencelist[1]}%
+ \setlength\photobook@imagecell@clearance@top{%
+ \photobook@imagecell@clearencelist[2]}\fi%
+ % args: left bottom right top
+ \ifnum \photobook@imagecell@clearencelistlen = 4%
+ \setlength\photobook@imagecell@clearance@left{%
+ \photobook@imagecell@clearencelist[1]}%
+ \setlength\photobook@imagecell@clearance@bottom{%
+ \photobook@imagecell@clearencelist[2]}%
+ \setlength\photobook@imagecell@clearance@right{%
+ \photobook@imagecell@clearencelist[3]}%
+ \setlength\photobook@imagecell@clearance@top{%
+ \photobook@imagecell@clearencelist[4]}\fi%
+ % XXX LEGACY...
\setlength\photobook@imagecell@clearance{#1}}%
% offsettop=<len> / offsetleft=<len>...
@@ -2398,10 +2507,14 @@
keepaspectratio,
width=\photobook@imagecell@scale\dimexpr
\cellwidth
- - ((\photobook@imagecell@clearance) * 2) \relax,
+ - \photobook@imagecell@clearance@left
+ - \photobook@imagecell@clearance@right \relax,
+ %- ((\photobook@imagecell@clearance) * 2) \relax,
height=\photobook@imagecell@scale\dimexpr
\cellheight
- - ((\photobook@imagecell@clearance) * 2) \relax]{#3}}%
+ - \photobook@imagecell@clearance@top
+ - \photobook@imagecell@clearance@bottom \relax]{#3}}%
+ %- ((\photobook@imagecell@clearance) * 2) \relax]{#3}}%
% fill...
\else\ifKV@imagecell@args@fill%
% preload image to get its proportions...
@@ -2420,14 +2533,18 @@
keepaspectratio,
width=\photobook@imagecell@scale\dimexpr
+ \cellwidth
- - ((\photobook@imagecell@clearance) * 2) \relax]{#3}}%
+ - \photobook@imagecell@clearance@left
+ - \photobook@imagecell@clearance@right \relax]{#3}}%
+ %- ((\photobook@imagecell@clearance) * 2) \relax]{#3}}%
\else%
\sbox{\photobook@imagebox}{%
\includegraphics[%
keepaspectratio,
height=\photobook@imagecell@scale\dimexpr
+ \cellheight
- - ((\photobook@imagecell@clearance) * 2) \relax]{#3}}%
+ - \photobook@imagecell@clearance@top
+ - \photobook@imagecell@clearance@bottom \relax]{#3}}%
+ %- ((\photobook@imagecell@clearance) * 2) \relax]{#3}}%
\fi\fi\fi%
%
\setlength\celloffsetleft{%
@@ -2470,7 +2587,14 @@
\maxdim{\celloffsetleft}{0pt}}%
\setlength\celloffsettop{%
\maxdim{\celloffsettop}{0pt}}%
- \setlength\clearance{\photobook@imagecell@clearance}%
+ % XXX EXPERIMENTAL CLEARANCE
+ \setlength\clearanceleft{\photobook@imagecell@clearance@left}
+ \setlength\clearancetop{\photobook@imagecell@clearance@top}
+ \setlength\clearanceright{\photobook@imagecell@clearance@right}
+ \setlength\clearancebottom{\photobook@imagecell@clearance@bottom}
+ \def\clearances{\photobook@imagecell@clearences}
+ % XXX LEGACY CLEARANCE
+ %\setlength\clearance{\photobook@imagecell@clearance}%
% clear parent...
% XXX might be a good idea to put this into a special reusable cell...
\ifphotobook@imagecell@captionclearparent%
@@ -2930,7 +3054,10 @@
- \cellwidth
- \clearcaption
% XXX this is only present in images...
- - \clearance \relax%
+ % XXX change this to use \clearanceleft / \clearanceright / ...
+ % XXX LEGACY CLEARANCE
+ - \clearance
+ \relax%
\else%
\photobook@captionblockcell@width\fi}%
\setlength\cellparentwidth{%
@@ -3917,7 +4044,9 @@
%%%%% Endpaper cells
%
%% \DescribeEnv{leftside}
+%%% \DescribeEnv{leftside*}
%% \DescribeEnv{rightside}
+%%% \DescribeEnv{rightside*}
%
%% \begin{minipage}{\textwidth}
%% \begin{verbatim}
@@ -3933,14 +4062,24 @@
%% \end{verbatim}
%% \end{minipage}
%%
+%%% The star versions set the appropriate bleeds for cliptocell.
+%%%
% XXX for some reason naming these anything starting with endpaper will
% make LaTeX complain that that is already defined...
% ...collision with bools???
\newenvironment{leftside}{%
- \begin{pagecell}%
+ \begin{cell*}%
+ {\bleed, \bleed}%
+ {\pageblockwidth}{\pageblockheight}%
}{%
- \end{pagecell}}
+ \end{cell*}}
+% XXX EXPERIMENTAL
+\newenvironment{leftside*}{%
+ \begin{leftside}%
+ \cliptocellbleeds{{\bleed} {\bleed} 0mm {\bleed}}%
+}{%
+ \end{leftside}}
\newenvironment{rightside}{%
\begin{cell*}%
@@ -3948,6 +4087,13 @@
{\pageblockwidth}{\pageblockheight}%
}{%
\end{cell*}}
+% XXX EXPERIMENTAL
+\newenvironment{rightside*}{%
+ \begin{rightside}%
+ \cliptocellbleeds{0mm {\bleed} {\bleed} {\bleed}}%
+}{%
+ \end{rightside}}
+
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/macros/latex/contrib/photobook/photobook.pdf b/macros/latex/contrib/photobook/photobook.pdf
index 9368564c5d..d78e1f2b17 100644
--- a/macros/latex/contrib/photobook/photobook.pdf
+++ b/macros/latex/contrib/photobook/photobook.pdf
Binary files differ
diff --git a/macros/latex/contrib/photobook/scripts/make-spreads.sh b/macros/latex/contrib/photobook/scripts/make-spreads.sh
index 6505e1091f..41dae4ec27 100644
--- a/macros/latex/contrib/photobook/scripts/make-spreads.sh
+++ b/macros/latex/contrib/photobook/scripts/make-spreads.sh
@@ -56,9 +56,11 @@ ANOTATE_IMAGE_PATHS=${ANOTATE_IMAGE_PATHS:=}
# supported formats/extensions...
TEXT_FORMATS=${TEXT_FORMATS:=$CFG_TEXT_FORMATS}
TEXT_FORMATS=${TEXT_FORMATS:=txt}
+TEXT_FORMATS=${TEXT_FORMATS,,}
IMAGE_FORMATS=${IMAGE_FORMATS:=$CFG_IMAGE_FORMATS}
IMAGE_FORMATS=${IMAGE_FORMATS:=jpeg|jpg|png|pdf|svg|eps}
+IMAGE_FORMATS=${IMAGE_FORMATS,,}
SPREADS_DIR=${SPREADS_DIR:=$CFG_SPREADS_DIR}
@@ -366,9 +368,9 @@ populateTemplate(){
local txt=()
local elem
for elem in "${items[@]}" ; do
- if [[ "$elem" =~ $IMAGE_FORMATS ]] ; then
+ if [[ "${elem,,}" =~ $IMAGE_FORMATS ]] ; then
img+=("$elem")
- elif [[ "$elem" =~ $TEXT_FORMATS ]] ; then
+ elif [[ "${elem,,}" =~ $TEXT_FORMATS ]] ; then
txt+=("$elem")
fi
done
@@ -491,10 +493,10 @@ handleSpread(){
local txt=()
local items=()
for elem in "$spread"/* ; do
- if [[ "$elem" =~ $IMAGE_FORMATS ]] ; then
+ if [[ "${elem,,}" =~ $IMAGE_FORMATS ]] ; then
img+=("$elem")
items+=("$elem")
- elif [[ "$elem" =~ $TEXT_FORMATS ]] ; then
+ elif [[ "${elem,,}" =~ $TEXT_FORMATS ]] ; then
txt+=("$elem")
items+=("$elem")
fi
@@ -574,7 +576,7 @@ handleSpread(){
# slots/files from list...
# image...
- if [[ "$elem" =~ $IMAGE_FORMATS ]] ; then
+ if [[ "${elem,,}" =~ $IMAGE_FORMATS ]] ; then
echo %
echo "% $P page (image)..."
template=`getTemplate "$spread" "$IMAGE_PAGE"`
diff --git a/macros/latex/required/babel/base/README.md b/macros/latex/required/babel/base/README.md
index f41986807e..12e18a9aa3 100644
--- a/macros/latex/required/babel/base/README.md
+++ b/macros/latex/required/babel/base/README.md
@@ -1,6 +1,6 @@
-## Babel 3.89
+## Babel 3.90
-2023-05-11
+2023-06-26
This package manages culturally-determined typographical (and other)
rules, and hyphenation patterns for a wide range of languages. Many
@@ -10,9 +10,9 @@ is a set of ini files for about 250 languages.
The latest stable version is available on <https://ctan.org/pkg/babel>.
-Changes in version 3.89 are described in:
+Changes in version 3.90 are described in:
-https://latex3.github.io/babel/news/whats-new-in-babel-3.89.html
+https://latex3.github.io/babel/news/whats-new-in-babel-3.90.html
Apart from the manual, you can find information on some aspects of babel at:
@@ -41,21 +41,25 @@ contact the developer, and not us!
You may also report them to the current maintainer more informally on:
- http://www.texnia.com/contact.html
+ https://latex3.github.io/babel/contact.html
Bugs related to specific languages are best reported to their
respective authors.
### Summary of latest changes
```
-3.89 2023-05-11
- * Deprecating \SetCase, \aliasshorthands, and 'strings' package
- options in the manual.
- * The manual has been split in two documents: 'babel.pdf' is the
- user guide, and 'babel-code.pdf' is the code.
- * Alternative syntax to pass 'modifiers' to babel languages.
- * Code cleaned up: babel.def has been shortened dramatically,
- and babel.sty is a bit smaller.
+3.90 2023-06-26
+ * Main language selected at begindocument/before (#240).
+ * Option to limit the number of inserted tatweel.
+ * New macros `\BabelUppercaseMapping` and
+ `\BabelLowercaseMapping`.
+ * Fix: line breaking was sometimes prevented when switching the
+ text direction (#213).
+ * Locale names (in ini files):
+ - `classicallatin` and `ecclesiasticallatin` now preferred to
+ `classiclatin` and `ecclesiasticlatin`.
+ - `farsi` is a synonymous for `persian`.
+ - `vietnam` removed - use `vietnamese`.
```
### Previous changes
diff --git a/macros/latex/required/babel/base/babel-code.pdf b/macros/latex/required/babel/base/babel-code.pdf
index afec13d466..8ac14245b4 100644
--- a/macros/latex/required/babel/base/babel-code.pdf
+++ b/macros/latex/required/babel/base/babel-code.pdf
Binary files differ
diff --git a/macros/latex/required/babel/base/babel.dtx b/macros/latex/required/babel/base/babel.dtx
index bc6e15cb9f..1477fd0449 100644
--- a/macros/latex/required/babel/base/babel.dtx
+++ b/macros/latex/required/babel/base/babel.dtx
@@ -32,7 +32,7 @@
%
% \iffalse
%<*filedriver>
-\ProvidesFile{babel.dtx}[2023/05/11 v3.89 The Babel package]
+\ProvidesFile{babel.dtx}[2023/06/26 v3.90 The Babel package]
\documentclass{ltxdoc}
\GetFileInfo{babel.dtx}
\usepackage{fontspec}
@@ -48,11 +48,7 @@
ItalicFont = NotoSans-Italic.ttf,
BoldItalicFont = NotoSans-BoldItalic.ttf]
{NotoSans-Regular.ttf}
-\setmonofont[
- Scale=.88, FakeStretch=.95,
- BoldFont = NotoMono-Regular.ttf,
- ItalicFont = NotoMono-Regular.ttf,
- BoldItalicFont = NotoMono-Regular.ttf]{NotoMono-Regular.ttf}
+\setmonofont[Scale=.86, FakeStretch=.97]{DejaVu Sans Mono}
\raggedright
\addtolength{\textwidth}{25pt}
\addtolength{\textheight}{3.5cm}
@@ -110,6 +106,7 @@
\newtheorem{note}{Note}
\newtheorem{example}{Example}
\newtheorem{troubleshooting}{Troubleshooting}
+\newtheorem{more}{More}
\let\bblxv\verbatim
\let\bblexv\endverbatim
\newcommand\setengine{\def\engine}
@@ -283,7 +280,9 @@ found a bug, I strongly beg you to report it in
\href{https://github.com/latex3/babel/issues}{GitHub}, which is much
better than just complaining on an e-mail list or a web forum. Remember
\textit{warnings are not errors} by themselves, they just warn about
-possible problems or incompatibilities.
+possible problems or incompatibilities. Hyphenation rules are
+maintained separately
+\href{https://github.com/hyphenation/tex-hyphen}{here}.
\item[\sffamily\color{messages}How can I contribute a new
language?] See section \ref{contribute} for contributing a language.
@@ -300,7 +299,7 @@ necessary in some languages), is described below; go to \ref{inifiles}.
there are many
\href{https://github.com/latex3/babel/tree/master/samples}{sample
files}.
-
+
\item[\sffamily\color{messages}Where is the code?]
Run |lualatex --jobname=babel-code \let\babelcode\relax\input{babel.dtx}|.
\end{description}
@@ -437,7 +436,12 @@ Package babel Warning: No hyphenation patterns were preloaded for
\begin{verbatim}
\usepackage[_pdflang=es-MX_]{hyperref}
\end{verbatim}
-This is not currently done by \babel{} and you must set it by hand.
+This is not currently done by \babel{} and you must set it by hand. The
+document language can be also set with |\DocumentMetadata|, before
+|\documentclass|; for example:
+\begin{verbatim}
+\DocumentMetadata{_lang=es-MX_}
+\end{verbatim}
\end{note}
\begin{note}
@@ -583,6 +587,14 @@ beforehand (for example, titles in a bibliography). At this regard, it
is worth remembering that |\babelfont| does \textit{not} load any font
until required, so that it can be used just in case.
+\New{3.84} With \pdftex, when a language is loaded on the fly
+(actually, with |\babelprovide|, because this is the macro used
+internally to load it) selectors now set the font encoding based on the
+list provided when loading |fontenc|. Not all scripts have an
+associated encoding, so this feature works only with Latin, Cyrillic,
+Greek, Arabic, Hebrew, Cherokee, Armenian, and Georgian, provided a
+suitable font is found.
+
\begin{example}
A trivial document with the default font in English and Spanish, and
FreeSerif in Russian is:
@@ -610,14 +622,6 @@ _\foreignlanguage{spanish}{Español}_.
for |lubakatanga|). See section \ref{bcp47} for further details.
\end{note}
-\New{3.84} With \pdftex, when a language is loaded on the fly
-(actually, with |\babelprovide|, because this is the macro used
-internally to load it) selectors now set the font encoding based on the
-list provided when loading |fontenc|. Not all scripts have an
-associated encoding, so this feature works only with Latin, Cyrillic,
-Greek, Arabic, Hebrew, Cherokee, Armenian, and Georgian, provided a
-suitable font is found.
-
\subsection{Modifiers}
\New{3.9c} The basic behavior of some languages can be modified when
@@ -1217,6 +1221,8 @@ languages.
footlines are not touched (only marks), and if they contain
language-dependent macros (which is not usual) there may be unexpected
results. With this option you may set the language in heads and foots.
+An alternative is to set the language explicitly when heads and foots
+are redefined.
\Describe{noconfigs}{} Global and language default config files are
not loaded, so you can make sure your document is not spoilt by an
@@ -1358,8 +1364,6 @@ reason, does not work as expected.
\begin{example}
Although Georgian has its own \texttt{ldf} file, here is how to
declare this language with an |ini| file in Unicode engines.
-\begingroup
-\setmonofont[Scale=.87,Script=Georgian]{DejaVu Sans Mono}
\setengine{luatex/xetex}
\begin{verbatim}
\documentclass{book}
@@ -1379,9 +1383,13 @@ _\babelprovide[import, main]{georgian}_
\end{document}
\end{verbatim}
-\endgroup
\end{example}
+\begin{more}
+ There is an example of how to use a template |ini| file
+ \href{https://github.com/latex3/babel/issues/176#issuecomment-1080846575}{here}, for Phoenician.
+\end{more}
+
\New{3.49} Alternatively, you can tell babel to load all or some
languages passed as options with |\babelprovide| and not from the |ldf|
file in a few few typical cases. Thus, |provide=*| means ‘load the main
@@ -1451,13 +1459,10 @@ need to set explicitly the script to either |deva| or |dev2|, eg:
wrongly with the default renderer. The comment about Indic scripts
and \textsf{lualatex} also applies here. Some quick patterns can
help, with something similar to:
-\begingroup
-\setmonofont[Script=Lao,Scale=MatchLowercase]{DejaVu Sans Mono}
\begin{verbatim}
\babelprovide[import, hyphenrules=+]{lao}
\babelpatterns[lao]{1ດ 1ມ 1ອ 1ງ 1ກ 1າ} % Random
\end{verbatim}
-\endgroup
\item[East Asia scripts] Settings for either Simplified of Traditional
should work out of the box, with basic line breaking with any
renderer. Although for a few words and shorts texts the |ini| files
@@ -1505,6 +1510,8 @@ captions):
\def\hascapl{\textsuperscript{l}}
\begin{multicols}{2}
+\tag{aa} Afar
+\tag{ab} Abkhazian
\tag{af} Afrikaans\hascapu\hascapl
\tag{agq} Aghem
\tag{ak} Akan
@@ -1526,11 +1533,14 @@ captions):
\tag{az-Cyrl} Azerbaijani
\tag{az-Latn} Azerbaijani
\tag{az} Azerbaijani\hascapu\hascapl
+\tag{bal} Baluchi
\tag{bas} Basaa
\tag{be} Belarusian\hascapu\hascapl
\tag{bem} Bemba
\tag{bez} Bena
\tag{bg} Bulgarian\hascapu\hascapl
+\tag{bgc} Haryanvi
+\tag{bho} Bhojpuri
\tag{bm} Bambara
\tag{bn} Bangla\hascapu
\tag{bo} Tibetan\hascapu
@@ -1539,13 +1549,16 @@ captions):
\tag{bs-Cyrl} Bosnian
\tag{bs-Latn} Bosnian\hascapu\hascapl
\tag{bs} Bosnian\hascapu\hascapl
+\tag{byn} Blin
\tag{ca} Catalan\hascapu\hascapl
+\tag{cch} Atsam
\tag{ce} Chechen
\tag{cgg} Chiga
\tag{chr} Cherokee
\tag{ckb-Arab} Central Kurdish\hascapu
\tag{ckb-Latn} Central Kurdish\hascapu
\tag{ckb} Central Kurdish\hascapu
+\tag{co} Corsican
\tag{cop} Coptic
\tag{cs} Czech\hascapu\hascapl
\tag{cu-Cyrs} Church Slavic\hascapu
@@ -1593,12 +1606,16 @@ captions):
\tag{fr-CA} Canadian French\hascapu\hascapl
\tag{fr-CH} Swiss French\hascapu\hascapl
\tag{fr-LU} French\hascapu\hascapl
+\tag{fr-x-acadian} Acadian\hascapu\hascapl
\tag{fr} French\hascapu\hascapl
\tag{fur} Friulian\hascapu\hascapl
\tag{fy} Western Frisian
\tag{ga} Irish\hascapu\hascapl
+\tag{gaa} Ga
\tag{gd} Scottish Gaelic\hascapu\hascapl
+\tag{gez} Geez
\tag{gl} Galician\hascapu\hascapl
+\tag{gn} Guarani
\tag{grc} Ancient Greek\hascapu\hascapl
\tag{gsw} Swiss German
\tag{gu} Gujarati
@@ -1620,12 +1637,15 @@ captions):
\tag{ii} Sichuan Yi
\tag{is} Icelandic\hascapu\hascapl
\tag{it} Italian\hascapu\hascapl
+\tag{iu} Inuktitut
\tag{ja} Japanese\hascapu
\tag{jgo} Ngomba
\tag{jmc} Machame
\tag{ka} Georgian\hascapu
\tag{kab} Kabyle
+\tag{kaj} Jju
\tag{kam} Kamba
+\tag{kcg} Tyap
\tag{kde} Makonde
\tag{kea} Kabuverdianu
\tag{kgp} Kaingang
@@ -1649,13 +1669,14 @@ captions):
\tag{ksh} Colognian
\tag{kw} Cornish
\tag{ky} Kyrgyz
-\tag{la-x-classic} Classic Latin\hascapu\hascapl
-\tag{la-x-ecclesia} Ecclesiastic Latin\hascapu\hascapl
+\tag{la-x-classic} Classical Latin\hascapu\hascapl
+\tag{la-x-ecclesia} Ecclesiastical Latin\hascapu\hascapl
\tag{la-x-medieval} Medieval Latin\hascapu\hascapl
\tag{la} Latin\hascapu\hascapl
\tag{lag} Langi
\tag{lb} Luxembourgish\hascapu\hascapl
\tag{lg} Ganda
+\tag{lij} Ligurian
\tag{lkt} Lakota
\tag{ln} Lingala
\tag{lo} Lao\hascapu
@@ -1680,7 +1701,9 @@ captions):
\tag{ms} Malay\hascapu\hascapl
\tag{mt} Maltese
\tag{mua} Mundang
+\tag{mus} Muscogee
\tag{my} Burmese
+\tag{myv} Erzya
\tag{mzn} Mazanderani
\tag{naq} Nama
\tag{nb} Norwegian Bokmål\hascapu\hascapl
@@ -1691,7 +1714,11 @@ captions):
\tag{nn} Norwegian Nynorsk\hascapu\hascapl
\tag{nnh} Ngiemboon
\tag{no} Norwegian\hascapu\hascapl
+\tag{nqo} N’Ko
+\tag{nr} South Ndebele
+\tag{nso} Northern Sotho
\tag{nus} Nuer
+\tag{ny} Nyanja
\tag{nyn} Nyankole
\tag{oc} Occitan\hascapu\hascapl
\tag{om} Oromo
@@ -1700,13 +1727,16 @@ captions):
\tag{pa-Arab} Punjabi
\tag{pa-Guru} Punjabi\hascapu
\tag{pa} Punjabi\hascapu
+\tag{pap} Papiamento
\tag{pl} Polish\hascapu\hascapl
\tag{pms} Piedmontese\hascapu\hascapl
+\tag{prg} Prussian
\tag{ps} Pashto
\tag{pt-BR} Brazilian Portuguese\hascapu\hascapl
\tag{pt-PT} European Portuguese\hascapu\hascapl
\tag{pt} Portuguese\hascapu\hascapl
\tag{qu} Quechua
+\tag{raj} Rajasthani
\tag{rm} Romansh\hascapu\hascapl
\tag{rn} Rundi
\tag{ro-MD} Moldavian\hascapu\hascapl
@@ -1726,6 +1756,7 @@ captions):
\tag{saq} Samburu
\tag{sbp} Sangu
\tag{sc} Sardinian
+\tag{scn} Sicilian
\tag{se} Northern Sami\hascapu\hascapl
\tag{seh} Sena
\tag{ses} Koyraboro Senni
@@ -1744,22 +1775,33 @@ captions):
\tag{sr-Cyrl-ME} Serbian\hascapu\hascapl
\tag{sr-Cyrl-XK} Serbian\hascapu\hascapl
\tag{sr-Cyrl} Serbian\hascapu\hascapl
+\tag{sr-ijekavsk} Serbian\hascapu\hascapl
\tag{sr-Latn-BA} Serbian\hascapu\hascapl
+\tag{sr-Latn-ijekavsk} Serbian\hascapu\hascapl
\tag{sr-Latn-ME} Serbian\hascapu\hascapl
\tag{sr-Latn-XK} Serbian\hascapu\hascapl
\tag{sr-Latn} Serbian\hascapu\hascapl
\tag{sr} Serbian\hascapu\hascapl
+\tag{ss} Swati
+\tag{ssy} Saho
+\tag{st} Southern Sotho
\tag{sv} Swedish\hascapu\hascapl
\tag{sw} Swahili
\tag{syr} Syriac
+\tag{szl} Silesian
\tag{ta} Tamil\hascapu
\tag{te} Telugu\hascapu
\tag{teo} Teso
\tag{th} Thai\hascapu\hascapl
\tag{ti} Tigrinya
+\tag{tig} Tigre
\tag{tk} Turkmen\hascapu\hascapl
+\tag{tn} Tswana
\tag{to} Tongan
+\tag{tpi} Tok Pisin
\tag{tr} Turkish\hascapu\hascapl
+\tag{trv} Taroko
+\tag{ts} Tsonga
\tag{twq} Tasawaq
\tag{tzm} Central Atlas Tamazight
\tag{ug} Uyghur\hascapu
@@ -1772,9 +1814,12 @@ captions):
\tag{vai-Latn} Vai
\tag{vai-Vaii} Vai
\tag{vai} Vai
+\tag{ve} Venda
\tag{vi} Vietnamese\hascapu\hascapl
+\tag{vo} Volapük
\tag{vun} Vunjo
\tag{wae} Walser
+\tag{wal} Wolaytta
\tag{xog} Soga
\tag{yav} Yangben
\tag{yi} Yiddish
@@ -1791,7 +1836,6 @@ captions):
\tag{zh-Hant} Chinese\hascapu
\tag{zh} Chinese\hascapu
\tag{zu} Zulu
-
\end{multicols}
\endgroup
\hrule
@@ -1806,93 +1850,129 @@ by |\babelprovide| with a valueless |import|.
\begingroup
\bigskip\hrule\nobreak
-
+\small
\let\\\par
-\begin{multicols}{2}
-afrikaans\\
+\begin{multicols}{3}
+abkhazian\\
+acadian\\
+afar\\
+afrikaans\\
aghem\\
akan\\
albanian\\
american\\
+americanenglish\\
amharic\\
ancientgreek\\
arabic\\
arabic-algeria\\
-arabic-DZ\\
+arabic-dz\\
+arabic-eg\\
+arabic-egypt\\
+arabic-iq\\
+arabic-iraq\\
+arabic-jo\\
+arabic-jordan\\
+arabic-lb\\
+arabic-lebanon\\
+arabic-ma\\
arabic-morocco\\
-arabic-MA\\
+arabic-palestinianterritories\\
+arabic-ps\\
+arabic-sa\\
+arabic-saudiarabia\\
+arabic-sy\\
arabic-syria\\
-arabic-SY\\
+arabic-tn\\
+arabic-tunisia\\
armenian\\
assamese\\
asturian\\
asu\\
+atsam\\
australian\\
+australianenglish\\
austrian\\
+azerbaijani\\
azerbaijani-cyrillic\\
azerbaijani-cyrl\\
azerbaijani-latin\\
azerbaijani-latn\\
-azerbaijani\\
bafia\\
+baluchi\\
bambara\\
+bangla\\
basaa\\
basque\\
belarusian\\
bemba\\
bena\\
-bangla\\
+bengali\\
+bhojpuri\\
+blin\\
bodo\\
+bosnian\\
bosnian-cyrillic\\
bosnian-cyrl\\
bosnian-latin\\
bosnian-latn\\
-bosnian\\
brazilian\\
+brazilianportuguese\\
breton\\
british\\
+britishenglish\\
bulgarian\\
burmese\\
canadian\\
+canadianenglish\\
cantonese\\
catalan\\
centralatlastamazight\\
centralkurdish\\
+centralkurdish-latin\\
+centralkurdish-latn\\
chechen\\
cherokee\\
chiga\\
+chinese\\
+chinese-hans\\
chinese-hans-hk\\
chinese-hans-mo\\
chinese-hans-sg\\
-chinese-hans\\
+chinese-hant\\
chinese-hant-hk\\
chinese-hant-mo\\
-chinese-hant\\
+chinese-simplified\\
chinese-simplified-hongkongsarchina\\
chinese-simplified-macausarchina\\
chinese-simplified-singapore\\
-chinese-simplified\\
+chinese-traditional\\
chinese-traditional-hongkongsarchina\\
chinese-traditional-macausarchina\\
-chinese-traditional\\
-chinese\\
churchslavic\\
churchslavic-cyrs\\
+churchslavic-glag\\
+churchslavic-glagolitic\\
churchslavic-oldcyrillic\footnote{The name in the CLDR
is Old Church Slavonic Cyrillic, but it has been shortened
for practical reasons.}\\
churchsslavic-glag\\
-churchsslavic-glagolitic\\
+churchslavonic\\
+classicallatin\\
colognian\\
+coptic\\
cornish\\
+corsican\\
croatian\\
czech\\
danish\\
duala\\
dutch\\
dzongkha\\
+ecclesiasticallatin\\
embu\\
+english\\
english-au\\
english-australia\\
english-ca\\
@@ -1903,41 +1983,52 @@ english-nz\\
english-unitedkingdom\\
english-unitedstates\\
english-us\\
-english\\
+erzya\\
esperanto\\
estonian\\
+europeanportuguese\\
ewe\\
ewondo\\
faroese\\
+farsi\\
filipino\\
finnish\\
+french\\
french-be\\
french-belgium\\
french-ca\\
french-canada\\
+french-canadianfrench\\
french-ch\\
french-lu\\
french-luxembourg\\
+french-swissfrench\\
french-switzerland\\
-french\\
friulian\\
fulah\\
+ga\\
galician\\
ganda\\
+geez\\
georgian\\
+german\\
german-at\\
german-austria\\
+german-austria-traditional\\
german-ch\\
german-switzerland\\
-german\\
+german-switzerland-traditional\\
+german-traditional\\
greek\\
+guarani\\
gujarati\\
gusii\\
+haryanvi\\
+hausa\\
hausa-gh\\
hausa-ghana\\
hausa-ne\\
hausa-niger\\
-hausa\\
hawaiian\\
hebrew\\
hindi\\
@@ -1947,12 +2038,15 @@ igbo\\
inarisami\\
indonesian\\
interlingua\\
+inuktitut\\
irish\\
italian\\
japanese\\
+jju\\
jolafonyi\\
kabuverdianu\\
kabyle\\
+kaingang\\
kako\\
kalaallisut\\
kalenjin\\
@@ -1965,18 +2059,22 @@ kikuyu\\
kinyarwanda\\
konkani\\
korean\\
+korean-han\\
+korean-hani\\
koyraborosenni\\
koyrachiini\\
+kurmanji\\
kwasio\\
kyrgyz\\
lakota\\
langi\\
lao\\
+latin\\
latvian\\
+ligurian\\
lingala\\
lithuanian\\
lowersorbian\\
-lsorbian\\
lubakatanga\\
luo\\
luxembourgish\\
@@ -1986,69 +2084,92 @@ machame\\
makhuwameetto\\
makonde\\
malagasy\\
+malay\\
malay-bn\\
malay-brunei\\
malay-sg\\
malay-singapore\\
-malay\\
malayalam\\
maltese\\
manx\\
marathi\\
masai\\
mazanderani\\
+medievallatin\\
meru\\
meta\\
mexican\\
+mexicanspanish\\
+moldavian\\
mongolian\\
+monotonicgreek\\
morisyen\\
mundang\\
+muscogee\\
nama\\
+naustrian\\
nepali\\
newzealand\\
+ngerman\\
ngiemboon\\
ngomba\\
+nheengatu\\
+nko\\
norsk\\
+northernkurdish\\
+northernkurdish-arab\\
+northernkurdish-arabic\\
northernluri\\
northernsami\\
+northernsotho\\
northndebele\\
+norwegian\\
norwegianbokmal\\
norwegiannynorsk\\
nswissgerman\\
nuer\\
+nyanja\\
nyankole\\
nynorsk\\
occitan\\
+odia\\
oriya\\
oromo\\
ossetic\\
+papiamento\\
pashto\\
persian\\
piedmontese\\
polish\\
polytonicgreek\\
+portuguese\\
portuguese-br\\
portuguese-brazil\\
portuguese-portugal\\
portuguese-pt\\
-portuguese\\
+prussian\\
+punjabi\\
punjabi-arab\\
punjabi-arabic\\
punjabi-gurmukhi\\
punjabi-guru\\
-punjabi\\
quechua\\
+rajasthani\\
romanian\\
+romanian-md\\
+romanian-moldova\\
romansh\\
rombo\\
rundi\\
russian\\
rwa\\
+saho\\
sakha\\
samburu\\
-samin\\
sango\\
sangu\\
+sanskrit\\
+sanskrit-bangla\\
sanskrit-beng\\
sanskrit-bengali\\
sanskrit-deva\\
@@ -2061,83 +2182,101 @@ sanskrit-malayalam\\
sanskrit-mlym\\
sanskrit-telu\\
sanskrit-telugu\\
-sanskrit\\
+sardinian\\
scottishgaelic\\
sena\\
+serbian\\
+serbian-cyrillic\\
serbian-cyrillic-bosniaherzegovina\\
serbian-cyrillic-kosovo\\
serbian-cyrillic-montenegro\\
-serbian-cyrillic\\
+serbian-cyrl\\
serbian-cyrl-ba\\
serbian-cyrl-me\\
serbian-cyrl-xk\\
-serbian-cyrl\\
+serbian-ijekavsk\\
+serbian-latin\\
serbian-latin-bosniaherzegovina\\
serbian-latin-kosovo\\
serbian-latin-montenegro\\
-serbian-latin\\
+serbian-latn\\
serbian-latn-ba\\
+serbian-latn-ijekavsk\\
serbian-latn-me\\
serbian-latn-xk\\
-serbian-latn\\
-serbian\\
+serbianc\\
shambala\\
shona\\
sichuanyi\\
+sicilian\\
+silesian\\
sinhala\\
slovak\\
slovene\\
slovenian\\
soga\\
somali\\
+sorani\\
+southernsotho\\
+southndebele\\
+spanish\\
spanish-mexico\\
spanish-mx\\
-spanish\\
standardmoroccantamazight\\
swahili\\
+swati\\
swedish\\
swissgerman\\
+swisshighgerman\\
+syriac\\
+tachelhit\\
tachelhit-latin\\
tachelhit-latn\\
tachelhit-tfng\\
tachelhit-tifinagh\\
-tachelhit\\
taita\\
tamil\\
+taroko\\
tasawaq\\
telugu\\
teso\\
thai\\
tibetan\\
+tigre\\
tigrinya\\
+tokpisin\\
tongan\\
+tsonga\\
+tswana\\
turkish\\
turkmen\\
+tyap\\
ukenglish\\
ukrainian\\
uppersorbian\\
urdu\\
usenglish\\
-usorbian\\
uyghur\\
+uzbek\\
uzbek-arab\\
uzbek-arabic\\
uzbek-cyrillic\\
uzbek-cyrl\\
uzbek-latin\\
uzbek-latn\\
-uzbek\\
+vai\\
vai-latin\\
vai-latn\\
vai-vai\\
vai-vaii\\
-vai\\
-vietnam\\
+venda\\
vietnamese\\
+volapuk\\
vunjo\\
walser\\
welsh\\
westernfrisian\\
+wolaytta\\
yangben\\
yiddish\\
yoruba\\
@@ -2221,7 +2360,7 @@ you may add further key/value pairs if necessary.
% will be disappointed :-). The following example is built ad hoc to
% emulate the final result to avoid dependencies, and therefore it's
% not "real" code.
-\setmonofont[Scale=.87,Script=Hebrew]{DejaVu Sans Mono} \catcode`@=13
+\catcode`@=13
\def@#1{\ifcase#1\relax \egroup \or \bgroup\textdir TLT \else
\bgroup\textdir TRT \fontspec[Scale=.87,Script=Hebrew]{Liberation
Mono} \fi}
@@ -2438,6 +2577,34 @@ hyphenation. The rest of the language definitions are not touched.
Without the optional argument it just loads some aditional tools if
provided by the |ini| file, like extra counters.
+\Describe{\BabelUppercaseMapping}
+ {\marg{locale-name}\marg{codepoint}\marg{output}}
+\DescribeOther{\BabelLowercaseMapping}
+ {\marg{locale-name}\marg{codepoint}\marg{output}}
+
+\New{3.90} These macros are devised as a high level interface for
+declaring case mappings, based on the locale name as declared by or
+with \babel. They are the equivalent of |\DeclareUppercaseMapping| and
+|\DeclareLowercaseMapping| (see \textsf{usrguide.pdf}). The purpose is
+twofold: (1) a user-friendly way to declare them, because
+often BCP 47 tags are not known (and sometimes can be complex);
+(2) if for some reason the tag changes (eg, you decide to tag
+`english` as `en-001` instead of `en-US`), the new mappings will be
+still assigned to that language.
+
+\begin{example} For Classical Latin (no need to know the tag is
+\texttt{la-x-classic}):
+\begin{verbatim}
+ \BabelUppercaseMapping{classicallatin}{`u}{V}
+\end{verbatim}
+\end{example}
+
+\begin{note}
+ There are still some rough edges when declaring a mapping with the
+ |x| extension, or when two \babel{} languages share the same BCP 47
+ tag. These issues will be sorted out in future releases.
+\end{note}
+
\subsection{Creating a language}
\New{3.10} And what if there is no style for your language or none fits
@@ -2486,6 +2653,20 @@ languages loaded on the fly are not yet available in the preamble.
\end{example}
\begin{example}
+ Sometimes treating the IPA as a language makes sense:
+\begin{verbatim}
+\documentclass{article}
+\usepackage[english]{babel}
+\babelprovide{ipa}
+\babelfont[ipa]{rm}{DejaVu Sans}
+\begin{document}
+Blah \foreignlanguage{ipa}{ɔːlˈðəʊ} Blah.
+\end{document}
+\end{verbatim}
+ Then you can define shorthands, transforms (with \luatex), and so on.
+\end{example}
+
+\begin{example}
Locales with names based on BCP 47 codes can be created with
something like:
\begin{verbatim}
@@ -2588,7 +2769,6 @@ Remerber there is an alternative syntax for the latter:
Finally, also remember you might not need to load |italian| at all if
there are only a few word in this language (see~\ref{mostlymono}).
-
\end{example}
\Describe{script=}{\meta{script-name}}
@@ -2610,7 +2790,28 @@ See the next section.
\Describe{Alph=}{\meta{counter-name}} Same for |\Alph|.
-\bigskip
+\Describe{casing}{\meta{rules}} \New{3.90} Selects the casing rules in a few
+languages. They are (from \textsf{interface3.pdf}):
+\begin{description}
+ \item[Armenian] |yiwn|, which maps U+0587 to capital ech and yiwn on
+ uppercasing.
+ \item[German] |eszett|, which maps the lowercase \textit{Eszett} to a
+ \textit{großes Eszett}.
+ \item[Greek] |iota|, which converts the \textit{ypogegrammeni} (subscript muted
+ iota) to capital iota when uppercasing.
+\end{description}
+
+\begin{example} For the latter:
+\begin{verbatim}
+\usepackage[greek]{babel}
+\babelprovide[_casing=iota_]{greek}
+\end{verbatim}
+\end{example}
+
+\smallskip
+\makebox[\linewidth][c]{*\qquad*\qquad*}
+\smallskip
+
A few options (only \luatex) set some properties of the writing system
used by the language. These properties are \textit{always} applied to
@@ -2986,7 +3187,7 @@ expandable, and the available fields are:
extension whose singleton is \m{s} (currently the recognized
singletons are |x|, |t| and |u|). The internal syntax can be somewhat
complex, and this feature is still somewhat tentative. An example is
- \textsf{classiclatin} which sets |extension.x.tag.bcp47| to |classic|.
+ \textsf{classicallatin} which sets |extension.x.tag.bcp47| to |classic|.
\New{3.75}
\end{description}
@@ -3671,7 +3872,8 @@ See particularly |lua-bidibasic.tex| and |lua-secenum.tex|.
% will be disappointed :-). The following example is built ad hoc to
% emulate the final result to avoid dependencies, and therefore it's
% not "real" code.
-\setmonofont[Scale=.87,Script=Arabic]{DejaVu Sans Mono} \catcode`@=13
+\setmonofont[Scale=.86, FakeStretch=.97,Script=Arabic]{DejaVu Sans Mono}
+\catcode`@=13
\def@#1{\ifcase#1\relax \egroup \or \bgroup\textdir TLT \else
\bgroup\textdir TRT \pardir TRT \fi}
\begin{verbatim}
@@ -3707,7 +3909,8 @@ _\babelprovide[import, main]{arabic}_
% will be disappointed :-). The following example is built ad hoc to
% emulate the final result to avoid dependencies, and therefore it's
% not "real" code.
- \setmonofont[Scale=.87,Script=Arabic]{DejaVu Sans Mono} \catcode`@=13
+ \setmonofont[Scale=.86, FakeStretch=.97,Script=Arabic]{DejaVu Sans Mono}
+ \catcode`@=13
\def@#1{\ifcase#1\relax \egroup \or \bgroup\textdir TRT \else
\bgroup\textdir TLT \pardir TLT \fi}
\begin{verbatim}
@@ -4096,7 +4299,7 @@ and |.ldf| file are listed, together with the names of the option which
you can load \babel\ with for each language. Note this list is open and
the current options may be different. It does not include |ini| files
(see below). Except in a few cases (eg, |ngerman|, |serbianc|,
-|acadien|) names are those of the Unicode CLDR (or based on them).
+|acadian|) names are those of the Unicode CLDR (or based on them).
\begin{description}
\itemsep=-\parskip
@@ -4164,7 +4367,7 @@ ibygreek, bgreek, serbianc, frenchle, ethiop} and \textsf{friulan}.
(\textsf{uppersorbian}), \textsf{vietnam} (\textsf{vietnamese}),
\textsf{northernsami} (\textsf{samin}), \textsf{ukraineb}
(\textsf{ukrainian}). Deprecated names come in many cases from the
- times when they had to be shortened to 8 characters.
+ times when they had to be shortened to 8 characters.
\end{note}
Most of them work out of the box, but some may require extra fonts,
@@ -5132,7 +5335,6 @@ Its natural place of use is in hooks or in |\extras|\m{language}.
\fi
-
\section{Acknowledgements}
I would like to thank all who volunteered as $\beta$-testers for their
@@ -5264,8 +5466,8 @@ wouldn’t exist.
% \section{Tools}
%
% \begin{macrocode}
-%<<version=3.89>>
-%<<date=2023/05/11>>
+%<<version=3.90>>
+%<<date=2023/06/26>>
% \end{macrocode}
%
% \textbf{Do not use the following macros in \texttt{ldf} files. They
@@ -6021,8 +6223,8 @@ wouldn’t exist.
% \end{macrocode}
%
% With |headfoot=lang| we can set the language used in heads/foots.
-% For example, in babel/3796 just adds |headfoot=english|. It
-% misuses \cs{@resetactivechars} but seems to work.
+% For example, in babel/3796 just add |headfoot=english|. It
+% misuses \cs{@resetactivechars}, but seems to work.
%
% \begin{macrocode}
\ifx\bbl@opt@headfoot\@nnil\else
@@ -7476,12 +7678,18 @@ wouldn’t exist.
\string\providecommand\string\babel@aux[2]{}}%
\immediate\write\@mainaux{\string\@nameuse{bbl@beforestart}}%
\fi
+%<-package>
\expandafter\selectlanguage\expandafter{\bbl@main@language}%
+%<+package>
\ifbbl@single % must go after the line above.
\renewcommand\selectlanguage[1]{}%
\renewcommand\foreignlanguage[2]{#2}%
\global\let\babel@aux\@gobbletwo % Also as flag
\fi}
+%<-core>
+\AddToHook{begindocument/before}{%
+ \expandafter\selectlanguage\expandafter{\bbl@main@language}}
+%<+core>
\ifcase\bbl@engine\or
\AtBeginDocument{\pagedir\bodydir} % TODO - a better place
\fi
@@ -10128,9 +10336,10 @@ wouldn’t exist.
\let\\\@Alph\<bbl@cntr@\bbl@KVP@Alph @\languagename>}}%
\fi
% == Casing ==
- \bbl@exp{\def\<bbl@casing@\languagename>%
- {\<bbl@lbcp@\languagename>%
- \ifx\bbl@KVP@casing\@nnil\else-x-\bbl@KVP@casing\fi}}%
+ \ifx\bbl@KVP@casing\@nnil\else
+ \bbl@csarg\xdef{casing@\languagename}%
+ {\@nameuse{bbl@casing@\languagename}-x-\bbl@KVP@casing}%
+ \fi
% == Calendars ==
\ifx\bbl@KVP@calendar\@nnil
\edef\bbl@KVP@calendar{\bbl@cl{calpr}}%
@@ -10591,9 +10800,9 @@ wouldn’t exist.
\bbl@exp{\\\bbl@exportkey{lname}{identification.name.opentype}%
{\csname bbl@elname@\languagename\endcsname}}%
\bbl@exportkey{tbcp}{identification.tag.bcp47}{}%
- \bbl@exportkey{lbcp}{identification.language.tag.bcp47}{}%
% Somewhat hackish. TODO
- \bbl@exportkey{casing}{identification.language.tag.bcp47}{}%
+ \bbl@exportkey{casing}{identification.tag.bcp47}{}%
+ \bbl@exportkey{lbcp}{identification.language.tag.bcp47}{}%
\bbl@exportkey{lotf}{identification.tag.opentype}{dflt}%
\bbl@exportkey{esname}{identification.script.name}{}%
\bbl@exp{\\\bbl@exportkey{sname}{identification.script.name.opentype}%
@@ -11262,8 +11471,18 @@ wouldn’t exist.
{\bbl@ifunset{bbl@\csname bbl@info@#1.tag.bcp47\endcsname @#2}{}%
{\bbl@cs{\csname bbl@info@#1.tag.bcp47\endcsname @#2}}}}
\fi
-% Still somewhat hackish:
+% Still somewhat hackish. WIP.
\@namedef{bbl@info@casing.tag.bcp47}{casing}
+\newcommand\BabelUppercaseMapping[3]{%
+ \let\bbl@tempx\languagename
+ \edef\languagename{#1}%
+ \DeclareUppercaseMapping[\BCPdata{casing}]{#2}{#3}%
+ \let\languagename\bbl@tempx}
+\newcommand\BabelLowercaseMapping[3]{%
+ \let\bbl@tempx\languagename
+ \edef\languagename{#1}%
+ \DeclareLowercaseMapping[\BCPdata{casing}]{#2}{#3}%
+ \let\languagename\bbl@tempx}
% \end{macrocode}
%
% With version 3.75 |\BabelEnsureInfo| is executed always, but there is
@@ -12139,7 +12358,7 @@ wouldn’t exist.
\bbl@trace{Loading basic (internal) bidi support}
\ifodd\bbl@engine
\else % TODO. Move to txtbabel
- \ifnum\bbl@bidimode>100 \ifnum\bbl@bidimode<200
+ \ifnum\bbl@bidimode>100 \ifnum\bbl@bidimode<200 % Any xe+lua bidi=
\bbl@error
{The bidi method 'basic' is available only in\\%
luatex. I'll continue with 'bidi=default', so\\%
@@ -12157,7 +12376,7 @@ wouldn’t exist.
\bbl@loadfontspec % bidi needs fontspec
\usepackage#1{bidi}}%
\fi}
- \ifnum\bbl@bidimode>200
+ \ifnum\bbl@bidimode>200 % Any xe bidi=
\ifcase\expandafter\@gobbletwo\the\bbl@bidimode\or
\bbl@tentative{bidi=bidi}
\bbl@loadxebidi{}
@@ -12169,7 +12388,7 @@ wouldn’t exist.
\fi
\fi
% TODO? Separate:
-\ifnum\bbl@bidimode=\@ne
+\ifnum\bbl@bidimode=\@ne % Any bidi= except default=1
\let\bbl@beforeforeign\leavevmode
\ifodd\bbl@engine
\newattribute\bbl@attr@dir
@@ -12302,7 +12521,7 @@ wouldn’t exist.
\newtoks\everypar
\everypar=\bbl@severypar
\bbl@severypar{\bbl@xeeverypar\the\everypar}}
- \ifnum\bbl@bidimode>200
+ \ifnum\bbl@bidimode>200 % Any xe bidi=
\let\bbl@textdir@i\@gobbletwo
\let\bbl@xebidipar\@empty
\AddBabelHook{bidi}{foreign}{%
@@ -13268,7 +13487,7 @@ wouldn’t exist.
% \begin{macrocode}
%<<*Footnote changes>>
\bbl@trace{Bidi footnotes}
-\ifnum\bbl@bidimode>\z@
+\ifnum\bbl@bidimode>\z@ % Any bidi=
\def\bbl@footnote#1#2#3{%
\@ifnextchar[%
{\bbl@footnote@o{#1}{#2}{#3}}%
@@ -14217,8 +14436,13 @@ end
\gdef\bbl@arabicjust{%
\let\bbl@arabicjust\relax
\newattribute\bblar@kashida
- \directlua{ Babel.attr_kashida = luatexbase.registernumber'bblar@kashida' }%
+ \newattribute\bblar@kashida@aux % 0, 1=tatweel, 2=diacritics
+ \directlua{% WIP
+ Babel.attr_kashida = luatexbase.registernumber'bblar@kashida'
+ Babel.attr_kashida_aux = luatexbase.registernumber'bblar@kashida@aux'
+ }%
\bblar@kashida=\z@
+ \bblar@kashida@aux=\z@
\bbl@patchfont{{\bbl@parsejalt}}%
\directlua{
Babel.arabic.elong_map = Babel.arabic.elong_map or {}
@@ -14294,6 +14518,7 @@ Babel.arabic.from = {}
Babel.arabic.dest = {}
Babel.arabic.justify_factor = 0.95
Babel.arabic.justify_enabled = true
+Babel.arabic.kashida_limit = -1
function Babel.arabic.justify(head)
if not Babel.arabic.justify_enabled then return head end
@@ -14322,6 +14547,7 @@ function Babel.arabic.justify_hlist(head, line, gc, size, pack)
local width, width_new, full, k_curr, wt_pos, goal, shift
local subst_done = false
local elong_map = Babel.arabic.elong_map
+ local cnt
local last_line
local GLYPH = node.id'glyph'
local KASHIDA = Babel.attr_kashida
@@ -14394,7 +14620,7 @@ function Babel.arabic.justify_hlist(head, line, gc, size, pack)
if #k_list == 0 then goto next_line end
width = node.dimensions(line.head) % The 'natural' width
- k_curr = #k_list
+ k_curr = #k_list % Traverse backwards, from the end
wt_pos = 1
while width < goal do
@@ -14419,6 +14645,22 @@ function Babel.arabic.justify_hlist(head, line, gc, size, pack)
end
end
+ % Limit the number of tatweel by removing them. Not very efficient,
+ % but it does the job in a quite predictable way.
+ if Babel.arabic.kashida_limit > -1 then
+ cnt = 0
+ for n in node.traverse_id(GLYPH, line.head) do
+ if n.char == 0x0640 then
+ cnt = cnt + 1
+ if cnt > Babel.arabic.kashida_limit then
+ node.remove(line.head, n)
+ end
+ else
+ cnt = 0
+ end
+ end
+ end
+
::next_line::
% Must take into account marks and ins, see luatex manual.
@@ -14892,7 +15134,8 @@ end
% math with the package option bidi=.
%
% \begin{macrocode}
-\ifnum\bbl@bidimode>\@ne % Excludes default=1
+\breakafterdirmode=1
+\ifnum\bbl@bidimode>\@ne % Any bidi= except default=1
\let\bbl@beforeforeign\leavevmode
\AtEndOfPackage{\EnableBabelHook{babel-bidi}}
\RequirePackage{luatexbase}
@@ -14947,7 +15190,7 @@ end
% math.
%
% \begin{macrocode}
-\ifnum\bbl@bidimode>\z@
+\ifnum\bbl@bidimode>\z@ % Any bidi=
\def\bbl@insidemath{0}%
\def\bbl@everymath{\def\bbl@insidemath{1}}
\def\bbl@everydisplay{\def\bbl@insidemath{2}}
@@ -14985,6 +15228,17 @@ end
% --, margins, etc.) with |bidi=basic|, without having to patch
% almost any macro where text direction is relevant.
%
+% Still, there are three areas deserving special attention, namely,
+% tabular, math, and graphics, text and intrinsically left-to-right
+% elements are intermingled. I've made some progress in graphics, but
+% they're essentially hacks; I've also made some progress in `tabular`,
+% but when I decided to tackle math (both standard math and `amsmath`)
+% the nightmare began. I'm still not sure how `amsmath` should be
+% modified, but the main problem is that, boxes are “generic”
+% containers that can hold text, math, and graphics (even at the same
+% time; remember that inline math is included in the list of text nodes
+% marked with 'math' (11) nodes too).
+%
% |\@hangfrom| is useful in many contexts and it is redefined always
% with the |layout| option.
%
@@ -15009,7 +15263,7 @@ end
\DeclareOption{fleqn}{\chardef\bbl@eqnpos\tw@}
%<</More package options>>
%
-\ifnum\bbl@bidimode>\z@
+\ifnum\bbl@bidimode>\z@ % Any bidi=
\ifx\matheqdirmode\@undefined\else
\matheqdirmode\@ne % A luatex primitive
\fi
@@ -15207,7 +15461,7 @@ end
{\IfBabelLayout{notabular}%
{\chardef\bbl@tabular@mode\z@}%
{\chardef\bbl@tabular@mode\@ne}}% Mixed, with LTR cols
-\ifnum\bbl@bidimode>\@ne
+\ifnum\bbl@bidimode>\@ne % Any bidi= except default=1
\ifnum\bbl@tabular@mode=\@ne
\let\bbl@parabefore\relax
\AddToHook{para/before}{\bbl@parabefore}
@@ -15252,7 +15506,7 @@ end
% |\@hangfrom|.
%
% \begin{macrocode}
-\ifnum\bbl@bidimode>\z@
+\ifnum\bbl@bidimode>\z@ % Any bidi=
\def\bbl@nextfake#1{% non-local changes, use always inside a group!
\bbl@exp{%
\def\\\bbl@insidemath{0}%
diff --git a/macros/latex/required/babel/base/babel.ins b/macros/latex/required/babel/base/babel.ins
index 3706b2c074..9aae84b337 100644
--- a/macros/latex/required/babel/base/babel.ins
+++ b/macros/latex/required/babel/base/babel.ins
@@ -26,7 +26,7 @@
%% and covered by LPPL is defined by the unpacking scripts (with
%% extension .ins) which are part of the distribution.
%%
-\def\filedate{2023/05/11}
+\def\filedate{2023/06/26}
\def\batchfile{babel.ins}
\input docstrip.tex
diff --git a/macros/latex/required/babel/base/babel.pdf b/macros/latex/required/babel/base/babel.pdf
index cdc413d277..1372db8c42 100644
--- a/macros/latex/required/babel/base/babel.pdf
+++ b/macros/latex/required/babel/base/babel.pdf
Binary files differ
diff --git a/macros/latex/required/babel/base/bbcompat.dtx b/macros/latex/required/babel/base/bbcompat.dtx
index cf059447fb..a75572297a 100644
--- a/macros/latex/required/babel/base/bbcompat.dtx
+++ b/macros/latex/required/babel/base/bbcompat.dtx
@@ -30,7 +30,7 @@
%
% \iffalse
%<*dtx>
-\ProvidesFile{bbcompat.dtx}[2023/05/11 v3.89]
+\ProvidesFile{bbcompat.dtx}[2023/06/26 v3.90]
%</dtx>
%
%% File 'bbcompat.dtx'
diff --git a/macros/plain/contrib/mlawriter/README b/macros/plain/contrib/mlawriter/README
new file mode 100644
index 0000000000..12d7638849
--- /dev/null
+++ b/macros/plain/contrib/mlawriter/README
@@ -0,0 +1,46 @@
+* How to use?
+
+\input mlawriter
+
+\mla
+\name {<First name>} <Last name>
+\teacher <Professor>
+\course <Course>
+\date <Date>
+\title{<title>}
+
+And start writing the body.
+
+After finished here is how to format citations:
+
+\citepage{<Title, could be Work Cited or Works Cited>}
+Cite 1
+
+Cite 2, separated as paragraphs
+\endcite
+
+And you are good to go.
+
+\bye
+
+* Additional macros
+
+\today Gives today's date.
+
+\quote
+...
+\endquote Quoting paragraphs
+
+* License
+
+Written in 2023-06-26 by LdBeth <ldbeth@sdf.org>
+
+To the extent possible under law, the author have dedicated all
+copyright and related and neighboring rights to this software to the
+public domain worldwide. This software is distributed without any
+warranty.
+
+You should have received a copy of the CC0 Public Domain Dedication
+along with this software. If not, see
+<http://creativecommons.org/publicdomain/zero/1.0/>.
+
diff --git a/macros/plain/contrib/mlawriter/mlawriter.tex b/macros/plain/contrib/mlawriter/mlawriter.tex
new file mode 100644
index 0000000000..0f3e0284d4
--- /dev/null
+++ b/macros/plain/contrib/mlawriter/mlawriter.tex
@@ -0,0 +1,68 @@
+% -*- mode: TeX -*-
+% The MLA style for plain TeX, Version 1.0.1 2023-06-26
+% written by LdBeth
+% CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
+% letter paper 8.5in * 11in, 1in margin
+\hsize = 6.5truein
+\vsize = 9truein
+\hoffset = 0pt
+\voffset = 0pt
+% "Times New Roman" font
+\font\twelverm = utmr7t at 12pt
+\font\twelveit = utmri7t at 12pt
+\font\twelvebf = utmb7t at 12pt
+\font\twelvesl = utmro7t at 12pt
+% page number
+\nopagenumbers
+\catcode`\@=11
+% headerline
+\def\setheader#1{\headline={\hfill #1 \folio}}
+% redefine plain TeX headline
+\def\makeheadline{\vbox to 0pt{\vskip-.5in
+ \line{\vbox to12pt{}\the\headline}\vss}
+ \nointerlineskip}
+% miscsettings
+%\interlinepenalty5000
+% format date
+\def\today{\number\day\space\ifcase\month\or
+ January\or February\or March\or April\or May\or June\or
+ July\or August\or September\or October\or November\or December\fi
+ \space\number\year}
+\newskip\@flushglue \@flushglue = 0pt plus 1fil
+\def\centering{%
+ \rightskip\@flushglue\leftskip\@flushglue
+ \parindent=\z@\parfillskip=\z@skip}
+\long\def\settitle#1{%
+\begingroup\centering #1\par\endgroup}
+% mla macro
+\outer\def\mla\name#1 #2\teacher#3\course#4\date#5\title{%
+ \setheader{#2}
+ \let\rm=\twelverm \let\bf=\twelvebf
+ \let\it=\twelveit \let\sl=\twelvesl
+ % double space, 24 lines per page
+ \baselineskip = 28pt minus 1pt
+ \parskip = 0pt
+ \parindent = .5in
+ % no hyphenation
+ \pretolerance = 10000\hbadness = 10000
+ \frenchspacing
+ \raggedright
+ \rm
+ \noindent #1 #2\par
+ \noindent #3\par
+ \noindent #4\par
+ \noindent #5\par
+ \settitle
+ }
+% quote macro
+\def\quote{\begingroup\noindent\leftskip = .5in }
+\def\endquote{\par\endgroup\noindent}
+% bib entry
+\def\citepage#1{%
+\vfil\eject
+\begingroup
+\parindent=\z@
+\everypar={\hangindent.5in}
+\centerline{#1}}
+\def\endcite{\par\endgroup}
+\catcode`\@=\active
diff --git a/macros/plain/contrib/mlawriter/testmla.pdf b/macros/plain/contrib/mlawriter/testmla.pdf
new file mode 100644
index 0000000000..18b84b3e08
--- /dev/null
+++ b/macros/plain/contrib/mlawriter/testmla.pdf
Binary files differ
diff --git a/macros/plain/contrib/mlawriter/testmla.tex b/macros/plain/contrib/mlawriter/testmla.tex
new file mode 100644
index 0000000000..abf335a30f
--- /dev/null
+++ b/macros/plain/contrib/mlawriter/testmla.tex
@@ -0,0 +1,73 @@
+\input mlawriter
+
+\mla
+\name {Aka the} LdBeth
+\teacher Professor William
+\course \TeX\ 101
+\date \today
+\title{Avoid Cargo Cult Programming\par Using Plain \TeX}
+
+While I know there is {\it mlacls}, there are a few fine details it
+either doesn't get right, or doesn't meet a specific style requirement
+that I need. And I'm surprised how much extra packages it depended to
+just get simple things like page size or header. These things are
+really simple! They are all described in the \TeX book.
+
+Nam et convallis lectus. Morbi fermentum massa vitae nunc vestibulum,
+quis bibendum odio venenatis. Vivamus vehicula, dolor ut consectetur
+auctor, nisl lorem pharetra libero, a tristique augue neque eu
+mi. Nulla fringilla volutpat erat, ut venenatis justo cursus ut. Nulla
+facilisi. Sed eget eros ex. Quisque vitae elementum nisl, ut facilisis
+ipsum. Aenean porttitor lorem ut neque sollicitudin, vel viverra
+libero tempor. Interdum et malesuada fames ac ante ipsum primis in
+faucibus.
+
+Suspendisse potenti. Fusce ultrices est ac libero sodales congue sit
+amet nec dolor. Sed vel dapibus dolor, sit amet faucibus dolor. Aenean
+porta turpis ac molestie semper. Curabitur tincidunt nulla sed arcu
+rhoncus, in pellentesque lorem molestie. Donec nec sem a elit dictum
+faucibus. Nunc porttitor mi id tellus rhoncus, in pulvinar neque
+congue. Pellentesque a massa feugiat, pharetra neque eu, vehicula
+tellus. Mauris venenatis elementum euismod. Vestibulum posuere sem eu
+leo tempus, sed auctor orci facilisis. Praesent maximus mollis neque
+ultricies vestibulum. Mauris tincidunt turpis metus, ut feugiat felis
+congue et. Proin hendrerit faucibus orci, eget facilisis nulla aliquam
+ut. Proin nec ornare enim, vitae hendrerit ipsum. Class aptent taciti
+sociosqu ad litora torquent per conubia nostra, per inceptos
+himenaeos.
+
+
+Neque porro quisquam est qui dolorem ipsum quia dolor sit amet,
+consectetur, adipisci velit:
+\quote
+Praesent luctus tortor et augue eleifend, a eleifend velit
+gravida. Maecenas blandit auctor finibus. Aliquam tempus lobortis
+dolor, eget pellentesque erat fermentum ac. Donec tempus orci eu magna
+hendrerit fermentum. Donec semper elit at lacinia interdum. Nulla
+malesuada justo velit. Quisque tincidunt in mauris consequat
+facilisis. Donec finibus lectus nec elementum auctor. Lorem ipsum
+dolor sit amet, consectetur adipiscing elit. Nulla est enim, vehicula
+id tincidunt eu, varius at purus. Class aptent taciti sociosqu ad
+litora torquent per conubia nostra, per inceptos himenaeos. Fusce
+vitae sem at ex pulvinar blandit. Maecenas facilisis ex id justo
+ultricies, in mattis ligula commodo. Curabitur sit amet neque eget
+metus dignissim lobortis. Donec fermentum consequat lobortis. Integer
+consequat tellus eget nibh imperdiet, sed porta nunc venenatis.
+\endquote
+Phasellus velit erat, congue eu consectetur sed, pretium at
+enim. Morbi id euismod lectus. Orci varius natoque penatibus et magnis
+dis parturient montes, nascetur ridiculus mus. Cras eu accumsan
+nulla. Morbi scelerisque, nisi at fermentum porta, mi tortor vehicula
+dolor, nec fermentum purus urna feugiat neque. Nulla sit amet nibh eu
+justo tincidunt tristique sit amet vitae lacus. Nam sit amet metus
+enim. Aenean auctor ex ex, eu scelerisque erat molestie ut. Aliquam
+mattis dapibus justo, non imperdiet erat imperdiet nec. Lorem ipsum
+dolor sit amet, consectetur adipiscing elit. Sed arcu mi, rhoncus ut
+tortor fringilla, venenatis elementum elit. Curabitur placerat justo
+eget urna pulvinar, sed aliquet elit pharetra. Etiam eget neque
+ornare, feugiat urna vel, mollis diam.
+
+\citepage{Work Cited}
+Knuth, Donald E. {\it The \TeX book.} Addison-Wesley, 1986.
+\endcite
+\bye