diff options
Diffstat (limited to 'macros/luatex/latex/luainputenc')
-rw-r--r-- | macros/luatex/latex/luainputenc/Makefile | 94 | ||||
-rw-r--r-- | macros/luatex/latex/luainputenc/NEWS | 27 | ||||
-rw-r--r-- | macros/luatex/latex/luainputenc/README | 78 | ||||
-rw-r--r-- | macros/luatex/latex/luainputenc/luainputenc.dtx | 1464 | ||||
-rw-r--r-- | macros/luatex/latex/luainputenc/luainputenc.pdf | bin | 0 -> 404095 bytes |
5 files changed, 1663 insertions, 0 deletions
diff --git a/macros/luatex/latex/luainputenc/Makefile b/macros/luatex/latex/luainputenc/Makefile new file mode 100644 index 0000000000..1ad5023e36 --- /dev/null +++ b/macros/luatex/latex/luainputenc/Makefile @@ -0,0 +1,94 @@ +# Makefile for luainputenc. + +NAME = luainputenc +DOC = $(NAME).pdf +DTX = $(NAME).dtx + +# Files grouped by generation mode +COMPILED = $(DOC) +UNPACKED = lutf8.def lutf8x.def inputenc.sty.diff \ + luainputenc.sty luainputenc.lua +SOURCE = $(DTX) README Makefile NEWS +GENERATED = $(COMPILED) $(UNPACKED) + +# Files grouped by installation location +UNPACKED_DOC = inputenc.sty.diff +RUNFILES = $(filter-out $(UNPACKED_DOC) test.tex, $(UNPACKED)) +DOCFILES = $(DOC) $(UNPACKED_DOC) test.tex README NEWS +SRCFILES = $(DTX) Makefile + +# The following definitions should be equivalent +# ALL_FILES = $(RUNFILES) $(DOCFILES) $(SRCFILES) +ALL_FILES = $(GENERATED) $(SOURCE) + +# Installation locations +FORMAT = lualatex +RUNDIR = $(TEXMFROOT)/tex/$(FORMAT)/$(NAME) +DOCDIR = $(TEXMFROOT)/doc/$(FORMAT)/$(NAME) +SRCDIR = $(TEXMFROOT)/source/$(FORMAT)/$(NAME) +TEXMFROOT = ./texmf + +CTAN_ZIP = $(NAME).zip +TDS_ZIP = $(NAME).tds.zip +ZIPS = $(CTAN_ZIP) $(TDS_ZIP) + +DO_TEX = tex --interaction=batchmode $< >/dev/null +DO_LATEXMK = latexmk -pdf -silent $< >/dev/null + +all: $(GENERATED) +doc: $(COMPILED) +unpack: $(UNPACKED) +ctan: check $(CTAN_ZIP) +tds: $(TDS_ZIP) +world: all ctan +.PHONY: all doc unpack ctan tds world check + +%.pdf: %.dtx + $(DO_LATEXMK) + +$(UNPACKED): $(DTX) + $(DO_TEX) + +check: $(UNPACKED) + lualatex --interaction=batchmode test.tex >/dev/null + +$(CTAN_ZIP): $(SOURCE) $(COMPILED) $(TDS_ZIP) + @echo "Making $@ for CTAN upload." + @$(RM) -- $@ + @zip -9 $@ $^ >/dev/null + +define run-install +@mkdir -p $(RUNDIR) && cp $(RUNFILES) $(RUNDIR) +@mkdir -p $(DOCDIR) && cp $(DOCFILES) $(DOCDIR) +@mkdir -p $(SRCDIR) && cp $(SRCFILES) $(SRCDIR) +endef + +$(TDS_ZIP): TEXMFROOT=./tmp-texmf +$(TDS_ZIP): $(ALL_FILES) + @echo "Making TDS-ready archive $@." + @$(RM) -- $@ + $(run-install) + @cd $(TEXMFROOT) && zip -9 ../$@ -r . >/dev/null + @$(RM) -r -- $(TEXMFROOT) + +.PHONY: install manifest clean mrproper + +install: $(ALL_FILES) + @echo "Installing in '$(TEXMFROOT)'." + $(run-install) + +manifest: + @echo "Source files:" + @for f in $(SOURCE); do echo $$f; done + @echo "" + @echo "Derived files:" + @for f in $(GENERATED); do echo $$f; done + +clean: + @latexmk -silent -c *.dtx >/dev/null + @# for tex-only runs: + @$(RM) -- *.log + +mrproper: clean + @$(RM) -- $(GENERATED) $(ZIPS) test.* + diff --git a/macros/luatex/latex/luainputenc/NEWS b/macros/luatex/latex/luainputenc/NEWS new file mode 100644 index 0000000000..ab5603073b --- /dev/null +++ b/macros/luatex/latex/luainputenc/NEWS @@ -0,0 +1,27 @@ + History of the luainputenc package + +2010/11/19 v0.973 + * fix stupid bug introduced in 0.971, spotted by Benoît Rivet + +2010/11/10 v0.972 + * adapt to luatexbase 0.3 + +2010/11/05 v0.971 + * improved documentation + * no longer loading luatextra + * fix bug under pdftex/xetex, thanks to Ulrike + +2010/05/11 v0.97 + * adapting to the new luatexbase system + +2010/02/07 v0.96 + * removing the files eu2enc.def and eu2lmr.fd from luainputenc, they + can now be found in the euenc package. + * creating luainputenc.package_option and luainputenc.encoding + +2009/11/28 v0.95 + * fixing a bug with \endlinechar introduced in LuaTeX 0.43 + +2009/09/23 v0.95 + * adapting to the new callback process_output_buffer introduced in + LuaTeX v0.43. diff --git a/macros/luatex/latex/luainputenc/README b/macros/luatex/latex/luainputenc/README new file mode 100644 index 0000000000..90f2439640 --- /dev/null +++ b/macros/luatex/latex/luainputenc/README @@ -0,0 +1,78 @@ + The luainputenc LaTeX2e package + + +luainputenc is an adaptation of inputenc for LuaTeX, as the old inputenc does +not work (at all) with the LuaTeX engine. It is used only for compatibility +with old documents. New documents should be encoded in UTF-8 and use Unicode +fonts (eg with a recent verion of the fontspec package). + +This package automatically calls the old inputenc when running with pdfTeX, and +xetex-inputenc when running XeTeX, so you can safely use it with all your +documents. + +This package is developed on <http://github.com/mpg/luainputenc>, see the 'NEWS' +file for version history. + +Installation +------------ + +Here are the recommended installation methods (preferred first). + +1. If you are using TeX Live 2008 or later, use 'tlmgr install luainputenc'. +Alternatively, try your (TeX or Linux) distribution's package management system. + +2. a. Grab luainputenc.tds.zip on the CTAN. + b. Unzip it at the root of one or your TDS trees. + c. You may need to update some filename database after, see your TeX +distribution's manual for details. + +3. a. Grab the sources from CTAN or github. + b. Run 'make install TEXMFROOT=/path/to/texmf'. + c. See 2c. + + +Manifest +-------- + +Source files: + luainputenc.dtx the single file source & doc + +Derived files: + luainputenc.pdf the documentation + luainputenc.sty the LaTeX package + luainputenc.lua the lua functions for encoding translation + lutf8.def replacement for utf8.def + lutf8x.def idem, with new functionalities for Unicode fonts + inputenc.sty.diff: patch for inputenc.sty to load luainputenc + automatically if running LuaTeX + +License +------- + +This work is under the CC0 license, with an additional restriction: +the article 6 of the LaTeX Project Public License (lppl), that applies to code +that has been taken from LaTeX files. + +You can find the text of the lppl at + +The lppl can be found at http://www.latex-project.org/lppl.txt + +You can find the CC0 full text at + +http://creativecommons.org/publicdomain/zero/1.0/legalcode + +The file luainputenc.dtx contains code with the lppl restriction as well as the +derived files + luainputenc.sty + luainputenc.pdf + lutf8.def + lutf8x.def + +For further details about their license, please see the comments in these files. + +The other derived files are + luainputenc.lua + inputenc.sty.diff + +These files are under the CC0 license only. + diff --git a/macros/luatex/latex/luainputenc/luainputenc.dtx b/macros/luatex/latex/luainputenc/luainputenc.dtx new file mode 100644 index 0000000000..807d7344b8 --- /dev/null +++ b/macros/luatex/latex/luainputenc/luainputenc.dtx @@ -0,0 +1,1464 @@ +% \iffalse meta-comment -- by the way, this file contains UTF-8 +% +% Written in 2009, 2010 by Manuel Pégourié-Gonnard and Élie Roux. +% <mpg@elzevir.fr> +% <elie.roux@telecom-bretagne.eu> +% +% This work is under the CC0 license. As an exception, the files +% luainputenc.sty, lutf8.def and lutf8x.def have more restrictions. +% See these file for more details. +% +% People who helped on this package: +% Javier Bezos +% Will Robertson +% Hans Hagen +% Heiko Oberdiek +% Javier Mugica +% +% This work consists of the main source file luainputenc.dtx +% and the derived files +% luainputenc.sty, luainputenc.lua, lutf8.def, lutf8x.def, +% and luainputenc.pdf +% +% Unpacking: +% tex luainputenc.dtx +% Documentation: +% pdflatex luainputenc.dtx +% +%<*ignore> +\begingroup + \def\x{LaTeX2e}% +\expandafter\endgroup +\ifcase 0\ifx\install y1\fi\expandafter + \ifx\csname processbatchFile\endcsname\relax\else1\fi + \ifx\fmtname\x\else 1\fi\relax +\else\csname fi\endcsname +%</ignore> +%<*install> +\input docstrip.tex + +\keepsilent +\askforoverwritefalse + +\let\MetaPrefix\relax + +\preamble +This is a generated file. + +Written in 2009, 2010 by Manuel Pegourie-Gonnard and Elie Roux. + +This work is under the CC0 license. As an exception, the files +luainputenc.sty, lutf8.def and lutf8x.def have more restrictions. +See these file for more details. + +People who helped on this package: + Javier Bezos + Will Robertson + Hans Hagen + Heiko Oberdiek + Javier Mugica + +This work consists of the main source file luainputenc.dtx +and the derived files + luainputenc.sty, luainputenc.lua, lutf8.def, lutf8x.def, + and luainputenc.pdf + +\endpreamble + +\let\MetaPrefix\DoubleperCent + +\generate{% + \usedir{tex/lualatex/luainputenc}% + \file{luainputenc.sty}{\from{luainputenc.dtx}{package}}% + \file{lutf8.def}{\from{luainputenc.dtx}{def}}% + \file{lutf8x.def}{\from{luainputenc.dtx}{defx}}% +} + +\generate{% + \usedir{doc/luatex/luainputenc}% + \file{test.tex}{\from{luainputenc.dtx}{test}}% +} + +\def\MetaPrefix{-- } + +\def\luapostamble{% + \MetaPrefix^^J% + \MetaPrefix\space End of File `\outFileName'.% +} + +\def\currentpostamble{\luapostamble}% + +\generate{% + \usedir{tex/lualatex/luainputenc}% + \file{luainputenc.lua}{\from{luainputenc.dtx}{lua}}% +} + +\nopreamble +\nopostamble + +\generate{% + \file{inputenc.sty.diff}{\from{luainputenc.dtx}{patch}}% +} + +\obeyspaces +\Msg{************************************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* files into a directory searched by TeX:} +\Msg{*} +\Msg{* luainputenc.sty luainputenc.lua lutf8.def lutf8x.def} +\Msg{*} +\Msg{* Happy TeXing!} +\Msg{*} +\Msg{************************************************************************} + +\endbatchfile +%</install> +%<*ignore> +\fi +%</ignore> +% \iffalse +%<package> +%<package>\NeedsTeXFormat{LaTeX2e} +%<package>\ProvidesPackage{luainputenc} +%<package> [2010/11/19 v0.973 inputenc package for LuaTeX] +%<package> +% \fi +%<*driver> +\documentclass{ltxdoc} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{textcomp} +\usepackage{lmodern} +\usepackage{metalogo} +\usepackage[lmargin=5cm, textwidth=14cm]{geometry} +\usepackage[bookmarks=true, colorlinks=true]{hyperref} +\usepackage{bookmark} +\usepackage[english]{babel} +\providecommand\eTeX{e\TeX} +\newcommand\pf{\textsf} +\newcommand\file{\texorpdfstring{\nolinkurl}{}} +\newcommand\code{\texttt} +\newcommand*\email[1]{\href{mailto:#1}{#1}} +\begin{document} + \DocInput{luainputenc.dtx}% +\end{document} +%</driver> +% \fi +% +% \CheckSum{0} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% \title{The \textsf{luainputenc} package} +% \date{2010/11/19 v0.973} +% \author{% +% Manuel P\'egouri\'e-Gonnard \email{mpg@elzevir.fr} \\ +% \'Elie Roux \email{elie.roux@telecom-bretagne.eu}} +% +% \maketitle +% +% \begin{abstract} +% Input encoding management for Lua\TeX, needed only for compatibility with +% old documents. For new documents, using UTF-8 encoding and Unicode fonts is +% \emph{strongly} recommended. You've been warned! +% \end{abstract} +% +% \tableofcontents +% +% \section{Overview: When (not) to use this package} +% +% This package is strictly meant for compatibility. It is usefull in the two +% (overlapping) following cases: +% \begin{enumerate} +% \item Your source is not encoded in UTF-8 and you don't want to reencode it +% for some reason. +% \item Your document is using legacy 8-bit fonts (with \pf{fontenc}), as +% opposed to modern Unicode fonts (most probably with \pf{fontspec} or +% \pf{luaotfload} and \pf{fontenc} with option \code{EU2}). +% \end{enumerate} +% Surprisingly enough, in the second case \pf{luainputenc} is needed, due to +% the way \LaTeX\ implements font encodings. +% +% From the user point of view, adapting an old document for \LuaTeX\ is really +% easy: replacing \pf{inputenc} by \pf{luainputenc} in the preamble is +% enough. +% +% Note that \pf{luainputenc} automatically loads \pf{inputenc} if called +% with an old engine, so you will still be able to compile your documents with +% pdf\TeX\ without changing them. +% +% \pf{luainputenc} has several modes of operation. By default, it basically +% turns \LuaTeX\ into an 8-bit engine, which means you loose half of the +% benefits from using \LuaTeX. If you are using only Unicode fonts, you can +% activate a nicer mode of operation using the \code{unactivate} package +% option. That way, \LuaTeX\ remains a true Unicode engine. +% +% Unicode fonts with \LuaTeX\ are handled using a new encoding: \code{EU2}. It +% is used internally by the \pf{fontspec} package when loading Unicode fonts. +% This encoding is special as it needs non-ASCII characters to be non-active +% (unlike other font encodings), so you cannot mix old encodings and EU2. If +% you're using only Unicode fonts, this isn't a problem: use the +% \code{unactivate} package option mentioned in the previous paragraph. +% +% But if you +% want to use both 8-bit fonts and Unicode fonts in your document, you need to +% use another package option, \code{lutf8x}. This option +% overrides \LaTeX's mechanism for font encoding switching, so that it +% (un)activates non-ASCII characters on-the-fly. With this options, you'll be +% able change the font encoding from/to \code{EU2}, for example: +% +% \begin{verbatim} +% abc +% { +% \fontencoding{EU2}\usefont +% \font\foo="MyOtfFont.otf"\foo +% abc +% } +% abc +% \end{verbatim} +% +% \section{Documentation} +% +% \subsection{Introduction} +% +% One the the most interesting new features of Lua\TeX\ is the fact that it is +% (like Omega/Aleph) not limited to 256 characters, and can now understand +% Unicode. The problem is that it does not read input the way older engines +% (like pdf\TeX) do, and thus \textsf{inputenc} is totally broken with Lua\TeX +% . This package aims at replacing \textsf{inputenc} for Lua\TeX , by adapting +% the way Lua\TeX\ handles input, and the way \textsf{inputenc} handles UTF-8. +% This package has two very distinct modes: 8-bit and UTF-8. +% +% \subsection{Overview of 8-bit mode} +% +% This package \textbf{does not} map 8-bit encodings to utf8. It allows +% Lua\TeX\ to read 8-bit characters, by converting each byte into a unicode +% character with the same character number. The resulting unicode characters +% are not true UTF-8, they are what we will call ``fake UTF-8". For example +% the byte 225 will be converted into the unicode character with number 225 +% (two bytes long). It will be true UTF-8 only if the encoding is latin1. +% +% Here is how it works: the 8-bit encodings are converted into fake UTF-8, so +% that the corresponding tokens are chars with the good numbers. Then (like +% \textsf{inputenc}) it reads the char numbers, and converts it into LICR +% (\LaTeX\ Internal Character Representation), with the font encoding. +% +% In Lua\TeX\ version 0.43, a new callback called |process_output_buffer|, +% this callbacks allows to make Lua\TeX\ write 8-bit instead of UTF-8, so the +% behaviour is the same as pdfTeX as this level. For versions prior to 0.43 +% though, we need to do more tricky things, described in the next paragraph. +% This machinery is disabled for Lua\TeX\ version 0.43 and superior, so you +% can keep the default behaviour, which will be compatible with pdfTeX in +% most cases, but you can consider the machinery obsolete. +% +% For these old versions, \textsf{luainputenc} only changes the input +% behaviour, it does not change the ouput behaviour (when files are written +% for example). The consequence is that files will still be written by +% Lua\TeX\ in UTF-8 (fake UTF-8 in this case), even if the asked input +% encoding is a 8-bit encoding. In most cases it's not a problem, as most +% files will be written in LICR, meaning ASCII, which is both 8-bit and UTF-8. +% The problem comes when characters with a number $>$ 128 are written in a +% 8-bit encoding. This may happen if you use |\protect| in a section for +% example. In these cases, Lua\TeX\ will write fake UTF-8, and try to read +% 8-bit encoding, so it will get confused. +% +% The proposed solution is to unactivate the input conversion when we read +% certain files or extentions. This package should work with no change for +% most documents, but if you cook your own aux files with an unknown +% extention, you may have to force the package to read some files in UTF-8 +% instead of 8-bit. See comments in the \texttt{.sty} file to know the useful +% commands. +% +% \subsection{Overview of UTF-8 mode} +% +% The behaviour of \textsf{inputenc} in utf8 mode is to read the input byte by +% byte, and decide if the character we are in is 1, 2, 3 or 4 bytes long, and +% then read other bytes accordingly. This behaviour fails with Lua\TeX\ +% because it reads input character by character (characters do not have a +% fixed number of bytes in unicode). The result is thus an error. +% +% All characters recognized by \TeX\ are active characters, that correspond to +% a LICR macro. Then \textsf{inputenc} reads the \texttt{*.dfu} files that +% contain the correspondance between these LICR macros and a character number +% in the fonts for different font encodings (T1, OT1, etc.). +% +% \subsubsection{legacy mode} +% +% \textsf{luainputenc} can get this behaviour (we will call it \emph{legacy +% mode}, but another difference implied by the fact that Lua\TeX\ can read +% more than 256 characters is that fonts can also have more than 256 +% characters. Lua\TeX\ can thus read unicode fonts. If we want to use unicode +% fonts (OTF for example), we can't use the \emph{legacy mode} anymore, as it +% would mean that we would have to rewrite a specially long +% \texttt{unicode.dfu} file, and it would be totally inefficient, as for +% instance \texttt{\'e} (unicode character number 233) would be mapped to +% \texttt{\string\'e}, and then mapped back to \texttt{\string\char\ 233}. +% +% \subsubsection{unicode font mode} +% +% To fix this, the most simple solution is to desactivate all activated +% characters, thus typing \texttt{\'e} will directly call +% \texttt{\string\char\ 233} in the unicode fonts, and produce a \texttt{\'e}. +% We will call this behaviour the \emph{unicode font mode}. To enable this +% mode, you can use the option \texttt{unactivate} in \textsf{luainputenc}, +% and you must use the font encoding \texttt{EU2} provided by the \textsf{euenc} +% package. See documentation of \textsf{euenc} package for more details about +% \texttt{EU2}. To use this mode with \texttt{EU2}, you must be able to open OTF +% fonts. A simple way to do so it by using the package \textsf{luaotfload}. +% +% \subsubsection{mixed mode} +% +% But the \emph{unicode font mode} has a strong limitation (that will +% certainly dissapear with time): it cannot use non-unicode fonts. If you want +% to mix unicode fonts and old fonts, you'll have to use the \emph{mixed +% mode}. In this mode you can type some parts of your document in \emph{legacy +% mode} and some in \emph{unicode font mode}. The reason why we chose not to +% integrate this choice in the \emph{legacy mode} is that we wanted to have a +% mode that preserved most of the backward compatibility, to safely compile +% old documents; the \emph{mixed mode} introduces new things that may break +% old documents. To get the \emph{mixed mode}, you must pass the option +% \texttt{lutf8x} to \textsf{luainputenc}. This mode is the most experimental. +% +% \section{Accessing the encoding in lua} +% +% In order to access the encoding and the package option in lua, two variables +% are set: |luainputenc.package_option| contains the option passed to the +% package, and |luainputenc.encoding| that contains the encoding (defaults to +% utf8, and is utf8 even with the options |unactivate|, |utf8x|, etc.). +% +% \section{Files} +% +% This package contains a \texttt{.sty} file for both \LaTeX\ and Plain, a +% patch for inputenc to use \textsf{luainputenc} so that you can process old +% documents without changing anything, and the lua functions. +% +% \subsection{\texttt{inputenc.sty} patch} +% +% A good thing would be to patch \textsf{inputenc} to load +% \textsf{luainputenc} instead, so that you don't have to change your +% documents to load \textsf{luainputenc} especially. The \LaTeX\ team is +% extremely conservative and does not want this patch applied (maybe we will +% find a solution later). Here is a patch for inputenc.sty: +% +% \iffalse +%<*patch> +% \fi +% +% \begin{macrocode} + + \ifnum\@tempcnta<`#2\relax + \advance\@tempcnta\@ne + \repeat} ++ ++\begingroup\expandafter\expandafter\expandafter\endgroup ++\expandafter\ifx\csname XeTeXversion\endcsname\relax\else ++ \RequirePackage{xetex-inputenc} ++ \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{xetex-inputenc}} ++ \ProcessOptions* ++ \expandafter\endinput ++\fi ++\begingroup\expandafter\expandafter\expandafter\endgroup ++\expandafter\ifx\csname directlua\endcsname\relax\else ++ \RequirePackage{luainputenc} ++ \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{luainputenc}} ++ \ProcessOptions* ++ \expandafter\endinput ++\fi ++ + \ProcessOptions + \endinput + %% + +% \end{macrocode} +% +% \iffalse +%</patch> +% \fi +% +% \subsection{\texttt{luainputenc.sty}} +% +% This file has some code from \texttt{inputenc.sty}, but also provides new +% options, and new macros to convert from 8-bit to fake UTF-8. +% +% \iffalse +%<*package> +% \fi +% +% \begin{macrocode} +% +%% This file was adapted from inputenc.sty, which copyright is: +%% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 2004 +%% 2005 2006 The LaTeX3 Project. +%% +%% inputenc.sty is under the lppl version 1.3c or later, and can be +%% found in the base LaTeX system. +%% +%% The lppl can be found at http://www.latex-project.org/lppl.txt +%% +%% The changes to inputenc.sty are Copyright 2009 Elie Roux, and are +%% under the CC0 license. +%% +%% The changes are LuaTeX support. +%% +%% This file is distributed under the CC0 license, with clause 6 of the +%% lppl as additional restrictions. + +% \end{macrocode} +% +% First we check if we are called with Lua\TeX , (pdf)\TeX or Xe\TeX . If +% we are called with pdf\TeX , we default to \textsf{inputenc}, and to +% \textsf{xetex-inputenc} if we are called with Xe\TeX . We also remap the +% new options to \texttt{utf8} in these cases. +% +% \begin{macrocode} + +\RequirePackage{ifluatex} +\RequirePackage{ifxetex} + +\ifxetex + \DeclareOption{unactivate}{\PassOptionsToPackage{utf8}{xetex-inputenc}} + \DeclareOption{lutf8}{\PassOptionsToPackage{utf8}{xetex-inputenc}} + \DeclareOption{lutf8x}{\PassOptionsToPackage{utf8}{xetex-inputenc}} + \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{xetex-inputenc}} + \ProcessOptions* + \RequirePackage{xetex-inputenc} + \expandafter\endinput +\fi + +\ifluatex\else + \DeclareOption{unactivate}{\PassOptionsToPackage{utf8}{inputenc}} + \DeclareOption{lutf8}{\PassOptionsToPackage{utf8}{inputenc}} + \DeclareOption{lutf8x}{\PassOptionsToPackage{utf8}{inputenc}} + \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{inputenc}} + \ProcessOptions* + \RequirePackage{inputenc} + \expandafter\endinput +\fi + +% \end{macrocode} +% +% Here we know we are called with Lua\TeX . We first require +% \textsf{luatextra} and ensure a few primitives, then we load the +% \texttt{lua} file. +% +% \begin{macrocode} + +\RequirePackage{luatexbase} +\luatexbase@ensure@primitive{luaescapestring} + +\RequireLuaModule{luainputenc} + +% \end{macrocode} +% +% Here is some code from \textsf{inputenc}. +% +% \begin{macrocode} + +\def\DeclareInputMath#1{% + \@inpenc@test + \bgroup + \uccode`\~#1% + \uppercase{% + \egroup + \def~% + }% +} +\def\DeclareInputText#1#2{% + \def\reserved@a##1 ${}% + \def\reserved@b{#2}% + \ifcat_\expandafter\reserved@a\meaning\reserved@b$ $_% + \DeclareInputMath{#1}{#2}% + \else + \DeclareInputMath{#1}{\IeC{#2}}% + \fi +} +\def\IeC{% + \ifx\protect\@typeset@protect + \expandafter\@firstofone + \else + \noexpand\IeC + \fi +} +% \end{macrocode} +% +% We changed a little the behaviour of this macro: we removed +% |\@inpenc@loop\^^?\^^ff|, because it made no sense in UTF-8 mode. We will +% call this line for 8-bit encodings. +% +% Note that the code has been changed for |\endlinechar|, because in new +% versions (from v0.43) of Lua\TeX{} the value cannot exceed 127. +% Thus, with the old version of \textsf{luainputenc}, when trying +% to add 10000, it fails silently, and when 10000 is substracted, the +% new value is -1, resulting in no end of lines at all in the document. +% +% \begin{macrocode} + +\def\inputencoding#1{% + \the\inpenc@prehook + \gdef\@inpenc@test{\global\let\@inpenc@test\relax}% + \edef\@inpenc@undefined{\noexpand\@inpenc@undefined@{#1}}% + \edef\inputencodingname{#1}% + \@inpenc@loop\^^A\^^H% + \@inpenc@loop\^^K\^^K% + \@inpenc@loop\^^N\^^_% + \xdef\saved@endlinechar{\the\endlinechar }% + \endlinechar=-1 + \xdef\saved@space@catcode{\the\catcode`\ }% + \catcode`\ 9\relax + \input{#1.def}% + \endlinechar=\saved@endlinechar{}% + \catcode`\ \saved@space@catcode\relax + \ifx\@inpenc@test\relax\else + \PackageWarning{inputenc}% + {No characters defined\MessageBreak + by input encoding change to `#1'\MessageBreak}% + \fi + \the\inpenc@posthook + \luatexbase@directlua{luainputenc.set_option("\luatexluaescapestring{#1}")} +} +\newtoks\inpenc@prehook +\newtoks\inpenc@posthook +\def\@inpenc@undefined@#1{\PackageError{inputenc}% + {Keyboard character used is undefined\MessageBreak + in inputencoding `#1'}% + {You need to provide a definition with + \noexpand\DeclareInputText\MessageBreak or + \noexpand\DeclareInputMath before using this key.}}% +\def\@inpenc@loop#1#2{% + \@tempcnta`#1\relax + \loop + \catcode\@tempcnta\active + \bgroup + \uccode`\~\@tempcnta + \uppercase{% + \egroup + \let~\inpenc@undefined + }% + \ifnum\@tempcnta<`#2\relax + \advance\@tempcnta\@ne + \repeat} + +% \end{macrocode} +% +% Here we declare our options. Note that we remap \texttt{utf8} to +% \texttt{lutf8}, because we use out \texttt{lutf8.def} instead of +% \textsf{inputenc}'s \texttt{utf8.def}. +% +% \begin{macrocode} + +\DeclareOption{utf8}{% + \inputencoding{lutf8}% +} + +\DeclareOption{lutf8}{% + \inputencoding{lutf8}% +} + +\DeclareOption{utf8x}{% + \inputencoding{lutf8}% +} + +\DeclareOption{lutf8x}{% + \inputencoding{lutf8x}% +} + +% \end{macrocode} +% +% For the \texttt{unactivate} option, for \emph{unicode font mode}, we just +% don't do anything. +% +% \begin{macrocode} + +\DeclareOption{unactivate}{% + \edef\inputencodingname{unactivate}% + \luatexbase@directlua{luainputenc.set_option([[unactivate]])} +} + +% \end{macrocode} +% +% All other options are 8-bit encodings, so we activate the translation +% into fake UTF-8, and we execute the loop we removes from +% |\inputencoding|. +% +% \begin{macrocode} + +\DeclareOption*{% + \lIE@activate % + \@inpenc@loop\^^?\^^ff% + \inputencoding{\CurrentOption}% +} + +% \end{macrocode} +% +% The rest of the file is only the machinery for LuaTeX versions without +% the callback |process_output_buffer|, so it will be deprecated after +% TeXLive 2009, you are not advised to use it. +% +% \begin{macrocode} + +\ifnum\luatexversion>42 + + \newcommand*{\lIE@activate}[0]{% + \luatexbase@directlua{luainputenc.register_callbacks()}% + } + +\else + +% \end{macrocode} +% +% |\lIE@setstarted| and |\lIE@setstopped| are called when the fake UTF-8 +% translation must be activated or desactivated. You can call them several +% successive times. They are called very often, even if the package is not +% activated (for example if it's loaded with the utf8 option), but they act +% only if the package is activated. +% +% \begin{macrocode} + +\newcommand*\lIE@setstarted[0]{% + \ifnum\lIE@activated=1 % + \luatexbase@directlua{luainputenc.setstarted()}% + \fi % +} + +\newcommand*\lIE@setstopped[0]{% + \ifnum\lIE@activated=1 % + \luatexbase@directlua{luainputenc.setstopped()}% + \fi % +} + +% \end{macrocode} +% +% The following 5 macros are made to declare a file that will have to be +% read in fake UTF-8 and not in 8-bit. These files are the ones that will +% be generated by \TeX . In \textbf{no way} this means you can include true +% UTF-8 files, it means that you can include files that have been written +% by Lua\TeX\ with \textsf{luainputenc}, which means files in fake UTF-8. +% The macros are very simple, when you call them with a file name (the same +% as the one you will use with \string\input ), it will read it with or +% without the fake UTF-8 translation. This package includes a whole bunch +% of extentions that will be read in fake UTF-8, so the occasions to use +% these macros will be rare, but if you use them, please report it to the +% package maintainer. +% +% \begin{macro}{\lIE@SetUtfFile} +% +% If you call this macro with a file name, each time you will input this +% file, it will be read in fake UTF-8. You can call it with a file that you +% generate with Lua\TeX\ and that you want to include. +% +% \begin{macrocode} + +\newcommand*\lIE@SetUtfFile[1]{% + \luatexbase@directlua{luainputenc.set_unicode_file("\luatexluaescapestring{#1}")}% +} + +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\lIE@SetNonUtfFile} +% +% Same as the previous macro, except that the file will be read as 8-bit. +% This macro is useful if there is an exception in an extention (see +% further comments). +% +% \begin{macrocode} + +\newcommand*\lIE@SetNonUtfFile[1]{% + \luatexbase@directlua{luainputenc.set_non_unicode_file("\luatexluaescapestring{#1}")}% +} + +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\lIE@UnsetFile} +% +% This macro gives a file the default behaviour of its extention. +% +% \begin{macrocode} + +\newcommand*\lIE@UnsetFile[1]{% + \luatexbase@directlua{luainputenc.unset_file("\luatexluaescapestring{#1}")}% +} + +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\lIE@SetUtfExt} +% +% You can tell \textsf{luainputenc} to treat all files with a particular +% extention in a certain way. The way the file extention is checked is to +% compare the four last characters of the filename. So if your extention +% has only three letters, you must include the preceding dot. This macro +% tells \textsf{luainputenc} to read all files from an extention in fake +% UTF-8. +% +% \begin{macrocode} + +\newcommand*\lIE@SetUtfExt[1]{% + \luatexbase@directlua{luainputenc.set_unicode_extention("\luatexluaescapestring{#1}")}% +} + +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\lIE@SetUtfExt} +% +% Same as before, but the files will be read in 8-bit. +% +% \begin{macrocode} + +\newcommand*\lIE@SetNonUtfExt[1]{ + \luatexbase@directlua{luainputenc.set_non_unicode_extention("\luatexluaescapestring{#1}")} +} + +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\lIE@InputUtfFile} +% +% This macro inputs a file in fake UTF-8. It has the ``feature" to unset +% the behaviour on the file you will call, so to be safe, you must call +% them with files for which the behaviour has not been set. +% +% \begin{macrocode} + + +\newcommand*\lIE@InputUtfFile[1]{% + \lIE@SetUtfFile{#1}% + \input #1% + \lIE@UnsetFile{#1}% +} + +% \end{macrocode} +% +% \end{macro} +% +% \begin{macro}{\lIE@InputNonUtfFile} +% +% Same as before, but to read a file as 8-bit. +% +% \begin{macrocode} + +\newcommand*\lIE@InputNonUtfFile[1]{% + \lIE@SetNonUtfFile{#1}% + \input #1% + \lIE@UnsetFile{#1}% +} + +% \end{macrocode} +% +% \end{macro} +% +% Two definitions to put the previous two macros in the user space. +% +% \begin{macrocode} + +\newcommand*\InputUtfFile[1]{% + \lIE@InputUtfFile{#1}% +} + +\newcommand*\InputNonUtfFile[1]{% + \lIE@InputNonUtfFile{#1}% +} + +\newcount\lIE@activated + +\newcommand*{\lIE@activate}[0]{% + \lIE@activated=1 % + \lIE@setstarted % +} + +\newcommand*{\lIE@FromInputenc}[1]{% + \ifnum\lIE@activated=0 % + \lIE@activate % + \fi% +} + +\fi + +\ProcessOptions* + +% \end{macrocode} +% +% \iffalse +%</package> +% \fi +% +% \iffalse +%<*def> +% \fi +% +% \subsection{\texttt{lutf8.def}} +% +% \begin{macrocode} +%% This file was adapted from utf8.def, which copyright is: +%% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 +%% 2004 2005 2006 The LaTeX3 Project. +%% +%% utf8.def is under the lppl version 1.3c or later, and can be found +%% in the base LaTeX system. +%% +%% The lppl can be found at http://www.latex-project.org/lppl.txt +%% +%% The changes to utf8.def are Copyright 2009 Elie Roux, and are under +%% the CC0 license. +%% +%% The changes are LuaTeX support. +%% +%% This file is distributed under the CC0 license, with clause 6 of the +%% lppl as additional restrictions. + +% \end{macrocode} +% +% Most of the file is taken from \texttt{utf8.def}, the main changes are +% commented. A lot of code was removed, especially the codes that analysed +% the unicode characters byte by byte. +% +% \begin{macrocode} + + +\ProvidesFile{lutf8.def} + [2010/05/10 v0.97 UTF-8 support for luainputenc] + +\makeatletter +\catcode`\ \saved@space@catcode + +\@inpenc@test + +\ifx\@begindocumenthook\@undefined + \makeatother + \endinput \fi + +% \end{macrocode} +% +% This function is changed a lot. Its aim is to map the character (first +% argument) to a macro (second argument). In \texttt{utf8.def} it was +% complicated as unicode was analyzed byte by byte. With Lua\TeX\ it is +% extremely simple, we just have to activate the character, and call a +% traditional |\DeclareInputTeXt|. +% +% \begin{macrocode} + +\gdef\DeclareUnicodeCharacter#1#2{% + \@tempcnta"#1% + \catcode\@tempcnta\active % + \DeclareInputText{\the\@tempcnta}{#2}% +} + +\@onlypreamble\DeclareUnicodeCharacter + +\def\cdp@elt#1#2#3#4{% + \wlog{Now handling font encoding #1 ...}% + \lowercase{% + \InputIfFileExists{#1enc.dfu}}% + {\wlog{... processing UTF-8 mapping file for font encoding + #1}% + \catcode`\ 9\relax}% + {\wlog{... no UTF-8 mapping file for font encoding #1}}% +} +\cdp@list + +\def\DeclareFontEncoding@#1#2#3{% + \expandafter % + \ifx\csname T@#1\endcsname\relax % + \def\cdp@elt{\noexpand\cdp@elt}% + \xdef\cdp@list{\cdp@list\cdp@elt{#1}% + {\default@family}{\default@series}% + {\default@shape}}% + \expandafter\let\csname#1-cmd\endcsname\@changed@cmd % + \begingroup % + \wlog{Now handling font encoding #1 ...}% + \lowercase{% + \InputIfFileExists{#1enc.dfu}}% + {\wlog{... processing UTF-8 mapping file for font encoding #1}}% + {\wlog{... no UTF-8 mapping file for font encoding #1}}% + \endgroup + \else + \@font@info{Redeclaring font encoding #1}% + \fi + \global\@namedef{T@#1}{#2}% + \global\@namedef{M@#1}{\default@M#3}% + \xdef\LastDeclaredEncoding{#1}% +} + +\DeclareUnicodeCharacter{00A9}{\textcopyright} +\DeclareUnicodeCharacter{00AA}{\textordfeminine} +\DeclareUnicodeCharacter{00AE}{\textregistered} +\DeclareUnicodeCharacter{00BA}{\textordmasculine} +\DeclareUnicodeCharacter{02C6}{\textasciicircum} +\DeclareUnicodeCharacter{02DC}{\textasciitilde} +\DeclareUnicodeCharacter{200C}{\textcompwordmark} +\DeclareUnicodeCharacter{2026}{\textellipsis} +\DeclareUnicodeCharacter{2122}{\texttrademark} +\DeclareUnicodeCharacter{2423}{\textvisiblespace} + +% \end{macrocode} +% +% \iffalse +%</def> +% \fi +% +% \iffalse +%<*defx> +% \fi +% +% \subsection{\texttt{lutf8x.def}} +% +% \begin{macrocode} +%% This file was adapted from utf8.def, which copyright is: +%% Copyright 1993 1994 1995 1996 1997 1998 1999 2000 2001 2002 2003 +%% 2004 2005 2006 The LaTeX3 Project. +%% +%% utf8.def is under the lppl version 1.3c or later, and can be found +%% in the base LaTeX system. +%% +%% The lppl can be found at http://www.latex-project.org/lppl.txt +%% +%% The changes to utf8.def are Copyright 2009 Elie Roux, and are under +%% the CC0 license. +%% +%% The changes are LuaTeX support. +%% +%% This file is distributed under the CC0 license, with clause 6 of the +%% lppl as additional restrictions. + +% \end{macrocode} +% +% This file is mostly the code from \texttt{lutf.def}, but it adds +% mechanisms to pass from \emph{legacy mode} to \emph{unicode font mode}. +% The trick is to put in a lua table all characters that are activated by +% the \emph{legacy mode}, and to unactivate them when we switch to +% \emph{unicode font mode}. This is made (almost) entirely in lua. The +% difficult part is the changes in |\DeclareFontEncoding|. +% +% \begin{macrocode} + +\ProvidesFile{lutf8x.def} + [2010/05/10 v0.97 UTF-8 support for luainputenc] + +\makeatletter +\catcode`\ \saved@space@catcode + +\@inpenc@test + +\ifx\@begindocumenthook\@undefined + \makeatother + \endinput \fi + +% \end{macrocode} +% +% We change it a little to add the activated character in the lua table. +% +% \begin{macrocode} + +\gdef\DeclareUnicodeCharacter#1#2{% + \@tempcnta"#1% + \luatexbase@directlua{luainputenc.declare_character('\the\@tempcnta')}% + \catcode\@tempcnta\active % + \DeclareInputText{\the\@tempcnta}{#2}% +} + +\@onlypreamble\DeclareUnicodeCharacter + +\def\cdp@elt#1#2#3#4{% + \wlog{Now handling font encoding #1 ...}% + \lowercase{% + \InputIfFileExists{#1enc.dfu}}% + {\wlog{... processing UTF-8 mapping file for font encoding + #1}% + \catcode`\ 9\relax}% + {\wlog{... no UTF-8 mapping file for font encoding #1}}% +} +\cdp@list + +% \end{macrocode} +% +% The macros to change from/to \emph{legacy mode} to/from \emph{unicode +% font mode}. +% +% \begin{macrocode} + +\def\lIE@ActivateUnicodeCatcodes{% +\luatexbase@directlua{luainputenc.activate_characters()}% +} + +\def\lIE@DesactivateUnicodeCatcodes{% +\luatexbase@directlua{luainputenc.desactivate_characters()}% +} + +\def\lIE@CharactersActivated{% +\luatexbase@directlua{luainputenc.force_characters_activated()} +} + +\edef\lIE@EU{EU2} + +% \end{macrocode} +% +% We add some code to automatically activate or unactivate characters +% according to the encoding changes. Note that we override |\@@enc@update|, +% which may pose some problems if a package of yours does it too. +% Fortunately this package is the only one that does it in \TeX Live. +% +% \begin{macrocode} + +\def\DeclareFontEncoding@#1#2#3{% + \edef\lIE@test{#1}% + \ifx\lIE@test\lIE@EU % + \ifx\LastDeclaredEncoding\lIE@EU\else % + \lIE@CharactersActivated % + \lIE@DesactivateUnicodeCatcodes % + \fi + \gdef\@@enc@update{% + \edef\lIE@test{#1}% + \ifx\f@encoding\lIE@EU % + \lIE@DesactivateUnicodeCatcodes % + \else % + \lIE@ActivateUnicodeCatcodes % + \fi + \expandafter\let\csname\cf@encoding-cmd\endcsname\@changed@cmd + \expandafter\let\csname\f@encoding-cmd\endcsname\@current@cmd + \default@T + \csname T@\f@encoding\endcsname + \csname D@\f@encoding\endcsname + \let\enc@update\relax + \let\cf@encoding\f@encoding + } + \else % + \expandafter % + \ifx\csname T@#1\endcsname\relax % + \def\cdp@elt{\noexpand\cdp@elt}% + \xdef\cdp@list{\cdp@list\cdp@elt{#1}% + {\default@family}{\default@series}% + {\default@shape}}% + \expandafter\let\csname#1-cmd\endcsname\@changed@cmd % + \begingroup % + \wlog{Now handling font encoding #1 ...}% + \lowercase{% + \InputIfFileExists{#1enc.dfu}}% + {\wlog{... processing UTF-8 mapping file for font encoding #1}}% + {\wlog{... no UTF-8 mapping file for font encoding #1}}% + \endgroup + \else + \@font@info{Redeclaring font encoding #1}% + \fi + \fi % + \global\@namedef{T@#1}{#2}% + \global\@namedef{M@#1}{\default@M#3}% + \xdef\LastDeclaredEncoding{#1}% +} + +\DeclareUnicodeCharacter{00A9}{\textcopyright} +\DeclareUnicodeCharacter{00AA}{\textordfeminine} +\DeclareUnicodeCharacter{00AE}{\textregistered} +\DeclareUnicodeCharacter{00BA}{\textordmasculine} +\DeclareUnicodeCharacter{02C6}{\textasciicircum} +\DeclareUnicodeCharacter{02DC}{\textasciitilde} +\DeclareUnicodeCharacter{200C}{\textcompwordmark} +\DeclareUnicodeCharacter{2026}{\textellipsis} +\DeclareUnicodeCharacter{2122}{\texttrademark} +\DeclareUnicodeCharacter{2423}{\textvisiblespace} + +% \end{macrocode} +% +% \iffalse +%</defx> +% \fi +% +% +% \subsection{\texttt{luainputenc.lua}} +% +% First the \texttt{inputenc} module is registered as a Lua\TeX\ module, +% with some informations. +% +% \iffalse +%<*lua> +% \fi +% +% \begin{macrocode} + +module('luainputenc', package.seeall) + +luainputenc.module = { + name = "luainputenc", + version = 0.97, + date = "2010/05/10", + description = "Lua simple inputenc package.", + author = "Elie Roux", + copyright = "Elie Roux", + license = "CC0", +} + +luatexbase.provides_module(luainputenc.module) + +local format = string.format + +luainputenc.log = luainputenc.log or function(...) + luatexbase.module_log('luainputenc', format(...)) +end + +% \end{macrocode} +% +% We keep the option and the true encoding in two variables. +% +% \begin{macrocode} + +luainputenc.encoding = "utf8" +luainputenc.package_option = nil + +function luainputenc.set_option(option) + luainputenc.package_option = option + if option == "lutf8" or option == "lutf8x" or option == "utf8x" or option == "unactivate" then + luainputenc.encoding = "utf8" + else + luainputenc.encoding = option + end +end + +% \end{macrocode} +% +% Some local declarations. +% +% \begin{macrocode} + +local char, utfchar, byte, format, gsub, utfbyte, utfgsub = +string.char, unicode.utf8.char, string.byte, string.format, string.gsub, unicode.utf8.byte, unicode.utf8.gsub + +% \end{macrocode} +% +% The function to transform a 8-bit character in the corresponding fake +% UTF-8 character. +% +% \begin{macrocode} + +function luainputenc.byte_to_utf(ch) + return utfchar(byte(ch)) +end + +% \end{macrocode} +% +% The function that will be registered in the +% \texttt{process\_input\_buffer} callback when needed. +% +% \begin{macrocode} + +function luainputenc.fake_utf_read(buf) + return gsub(buf,"(.)", luainputenc.byte_to_utf) +end + +% \end{macrocode} +% +% The function to transform a fake utf8 character in the corresponding +% 8-bit character. +% +% \begin{macrocode} + +function luainputenc.utf_to_byte(ch) + return char(utfbyte(ch)) +end + +% \end{macrocode} +% +% The function that will be registered in the +% \texttt{process\_output\_buffer} callback if it exists. +% +% \begin{macrocode} + +function luainputenc.fake_utf_write(buf) + return utfgsub(buf,"(.)", luainputenc.utf_to_byte) +end + +% \end{macrocode} +% +% Here we register the two callbacks, and the behaviour is the same as in pdfTeX. +% The next part of the file is only the machinery for LuaTeX versions without +% the callback |process_output_buffer|, so it will be deprecated after +% TeXLive 2009, you are not advised to use it. +% +% \begin{macrocode} + +if tex.luatexversion > 42 then + + function luainputenc.register_callbacks() + luatexbase.add_to_callback('process_output_buffer', luainputenc.fake_utf_write, 'luainputenc.fake_utf_write') + luatexbase.add_to_callback('process_input_buffer', luainputenc.fake_utf_read, 'luainputenc.fake_utf_read') + end + +else + +% \end{macrocode} +% +% \texttt{start()} and \texttt{stop()} are the functions that register or +% unregister the function in the callback. When the function is registered, +% Lua\TeX\ reads the input in fake UTF-8. +% +% \begin{macrocode} + + local started, stopped = 1, 0 + + luainputenc.state = stopped + + function luainputenc.setstate(state) + if state == luainputenc.state then + return + elseif state == started then + luainputenc.start() + else + luainputenc.stop() + end + end + + function luainputenc.setstarted() + luainputenc.setstate(started) + end + + function luainputenc.setstopped() + luainputenc.setstate(stopped) + end + + function luainputenc.start() + luatexbase.add_to_callback('process_input_buffer', luainputenc.fake_utf_read, + 'luainputenc.fake_utf_read') + luainputenc.state = started + if luainputenc.callback_registered == 0 then + luainputenc.register_callback() + end + end + + function luainputenc.stop() + luatexbase.remove_from_callback('process_input_buffer', 'luainputenc.fake_utf_read') + luainputenc.state = stopped + return + end + +% \end{macrocode} +% +% Here is a list of all file extentions for which we consider that the +% files have been written by Lua\TeX , and thus must be read in fake UTF-8. +% I may have forgotten things in the list. If you find a new extention, +% please report the maintainer. +% +% \begin{macrocode} + + luainputenc.unicode_extentions = { + ['.aux'] = 1, -- basic files + ['.toc'] = 1, + ['.gls'] = 1, + ['.ind'] = 1, + ['.idx'] = 1, + ['.vrb'] = 1, -- beamer and powerdot + ['.nav'] = 1, -- other beamer extentions + ['.sol'] = 1, + ['.qsl'] = 1, + ['.snm'] = 1, + ['.pgn'] = 1, -- pagereference + ['.cpg'] = 1, -- AlProTeX + ['.pst'] = 1, -- pst-tree + ['.tmp'] = 1, -- sauerj/collect + ['.sym'] = 1, -- listofsymbols + ['.sub'] = 1, -- listofsymbols + ['.lof'] = 1, -- preprint + ['.lot'] = 1, -- preprint + ['mtc1'] = 1, -- minitoc + ['.ovr'] = 1, -- thumbss + ['.fff'] = 1, -- endplate + ['.sbb'] = 1, -- splitbib + ['.bbl'] = 1, -- latex + ['.ain'] = 1, -- authorindex + ['.abb'] = 1, -- juraabbrev + ['.ent'] = 1, -- endnotes + ['.end'] = 1, -- fn2end + ['.thm'] = 1, -- ntheorem + ['.xtr'] = 1, -- extract + ['.han'] = 1, -- linguho + ['.bnd'] = 1, -- bibref + ['.bbl'] = 1, -- bibref + ['.col'] = 1, -- mwrite + ['.ttt'] = 1, -- endfloat + ['.fax'] = 1, -- lettre + ['.tns'] = 1, -- lettre + ['.odt'] = 1, -- lettre + ['.etq'] = 1, -- lettre + ['.emd'] = 1, -- poemscol + ['.emx'] = 1, -- poemscol + ['.ctn'] = 1, -- poemscol + ['.hst'] = 1, -- vhistory + ['.acr'] = 1, -- crosswrd + ['.dwn'] = 1, -- crosswrd + ['.ttc'] = 1, -- talk + -- ['.txt'] = 1, -- coverpage, but not sure it's safe to include it... + ['.eve'] = 1, -- calend0 + ['.scn'] = 1, -- cwebmac + } + +% \end{macrocode} +% +% The code to define a specific behaviour for certain files. +% +% \begin{macrocode} + + luainputenc.unicode_files = {} + + luainputenc.non_unicode_files = {} + + function luainputenc.set_unicode_file(filename) + if luainputenc.non_unicode_files[filename] == 1 then + luainputenc.non_unicode_files[filename] = nil + end + luainputenc.unicode_files[filename] = 1 + end + + function luainputenc.set_non_unicode_file(filename) + if luainputenc.unicode_files[filename] == 1 then + luainputenc.unicode_files[filename] = nil + end + luainputenc.non_unicode_files[filename] = 1 + end + + function luainputenc.set_unicode_extention(ext) + luainputenc.unicode_extention[ext] = 1 + end + + function luainputenc.set_non_unicode_extention(ext) + if luainputenc.unicode_extentions[ext] == 1 then + luainputenc.unicode_extentions[ext] = nil + end + end + + function luainputenc.unset_file(filename) + if luainputenc.unicode_files[filename] == 1 then + luainputenc.unicode_files[filename] = nil + elseif luainputenc.non_unicode_files[filename] == 1 then + luainputenc.non_unicode_files[filename] = nil + end + end + + local unicode, non_unicode = stopped, started + + function luainputenc.find_state(filename) + if luainputenc.unicode_files[filename] == 1 then + return unicode + elseif luainputenc.non_unicode_files[filename] == 1 then + return non_unicode + else + local ext = filename:sub(-4) + if luainputenc.unicode_extentions[ext] == 1 then + return unicode + else + return non_unicode + end + end + end + +% \end{macrocode} +% +% We register the functions to stop or start the fake UTF-8 translation in +% the appropriate callbacks if necessary. +% +% \begin{macrocode} + + function luainputenc.pre_read_file(env) + if not env.path then + return + end + local currentstate = luainputenc.state + luainputenc.setstate(luainputenc.find_state(env.filename)) + env.previousstate = currentstate + end + + function luainputenc.close(env) + luainputenc.setstate(env.previousstate) + end + + luainputenc.callback_registered = 0 + + function luainputenc.register_callback() + if luainputenc.callback_registered == 0 then + luatexbase.add_to_callback('pre_read_file', luainputenc.pre_read_file, + 'luainputenc.pre_read_file') + luatexbase.add_to_callback('file_close', luainputenc.close, 'luainputenc.close') + luainputenc.callback_registered = 1 + end + end + +end + +% \end{macrocode} +% +% Finally we provide some functions to activate or disactivate the catcodes +% of the non-ASCII characters. +% +% \begin{macrocode} + + +luainputenc.activated_characters = {} +luainputenc.characters_are_activated = false + +function luainputenc.declare_character(c) + luainputenc.activated_characters[tonumber(c)] = true +end + +function luainputenc.force_characters_activated () + luainputenc.characters_are_activated = true +end + +function luainputenc.activate_characters() + if not luainputenc.characters_are_activated then + for n, _ in pairs(luainputenc.activated_characters) do + tex.sprint(string.format('\\catcode %d\\active',n)) + end + luainputenc.characters_are_activated = true + end +end + +function luainputenc.desactivate_characters() + if luainputenc.characters_are_activated then + for n, _ in pairs(luainputenc.activated_characters) do + tex.sprint(string.format('\\catcode %d=11',n)) + end + luainputenc.characters_are_activated = false + end +end + +% \end{macrocode} +% +% \iffalse +%</lua> +% \fi +% +% \section{Test file} +% +% Very minimal, just check that the package correctly loads with an option +% and doesn't crash on a one-line plain ASCII document body\dots +% +% \begin{macrocode} +%<*test> +\documentclass{article} +\usepackage[utf8]{luainputenc} +\begin{document} +bla +\end{document} +%</test> +% \end{macrocode} +% +% \Finale +\endinput diff --git a/macros/luatex/latex/luainputenc/luainputenc.pdf b/macros/luatex/latex/luainputenc/luainputenc.pdf Binary files differnew file mode 100644 index 0000000000..d6db0888b3 --- /dev/null +++ b/macros/luatex/latex/luainputenc/luainputenc.pdf |