% \iffalse %% Source File: textcase.dtx %% Copyright 2015 David Carlisle %% %% This file may be distributed under the terms of the LPPL. %% See README for details. % %<*dtx> \ProvidesFile{ucharcat.dtx} % %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{ucharcat} % \ProvidesFile{ucharcat.drv} % \fi % \ProvidesFile{ucharcat.dtx} [2015/11/19 v0.03 ucharcat for luaLaTeX (DPC)] % % \iffalse %<*driver> \documentclass{ltxdoc} \ifx\directlua\undefined\else \usepackage{ucharcat} \fi \begin{document} \DocInput{ucharcat.dtx} \end{document} % % \fi % % \GetFileInfo{ucharcat.dtx} % % \title{The \textsf{ucharcat} Package\thanks{This file % has version number \fileversion, last % revised \filedate. % Please report any issues at https://github.com/davidcarlisle/dpctex/issues}} % \author{David Carlisle} % \maketitle % % \section{Introduction} % % The 2015 release of Xe\TeX\ introduced a new command |\Ucharcat|, % this is an extension of the |\Uchar| comand that has been available % in Xe\TeX\ and lua\TeX\ for some time. It takes a second integer % value, that specifies the category code of the token to be % produced. This allows character tokens to be constructed \emph{via % expansion}, which has many potential uses in producing expandable % case changing, numeric counter represntations, etc. % % |\Uchar 65 12| produces a catcode 12 |A| for example. % % This package provides a lua implementation of |\Ucharcat| for use % with luatex, it silently accepts Xe\TeX\ and does nothing in that % case if |\Ucharcat| is defined. % % The main difference between the lua implementation and the Xe\TeX\ % primitive is that the lua implementation takes \emph{two} expansions % to produce the token. % %\begin{verbatim} % \edef\tmp{\Uchar 65 11 } %\end{verbatim} % is the same as |\def\tmp{A}| with both % systems but % %\begin{verbatim} % \expandafter\def\expandafter\tmp\expandafter{\Uchar 65 11 } %\end{verbatim} % the same as %\begin{verbatim} % \def\tmp{A} %\end{verbatim} % with Xe\TeX, but in lua\TeX\ it is % equivalent to %\begin{verbatim} % \def\tmp{\directlua{UcharcatLua() 65 11 } %\end{verbatim} % % \ifx\Ucharcat\undefined\else % \section{Examples} % % This section will be omitted if this document is not processed with % a suitable format. % % \begin{itemize} % \item |\Ucharcat 65 11| % % \Ucharcat 65 11\ is a capital A. % % \item |\Ucharcat 65 12| % \edef\tmpa{\Ucharcat 65 12} % \edef\tmpb{\string A} % % This is a catcode 12 A: \ifx\tmpa\tmpb yes\else no\fi. % % \item% |\Ucharcat 65 1| and |\Ucharcat 65 2| % % \Ucharcat 65 1 \large\bfseries Bold is grouped \Ucharcat 65 2 % by catcode 1 and 2 A. % \end{itemize} % % \fi % \section{Implementation} % % Note that the current implementation uses |\directlua| and a % dedicated luatex catcode array. Hans hagen made some useful comments % and pointers to alternative implementation using |\luafunction| % in the luatex list thread % \texttt{http://tug.org/pipermail/luatex/2015-May/005199.html} % For now keeping with the simpler initial approach as there % is no built in support for |\luafunction| in the \LaTeX\ format yet. % (No hook to save function definition in the format) % % \begin{macrocode} %<*package> % \end{macrocode} % On classic \TeX{} or old Xe\TeX, stop. % \begin{macrocode} \ifx\directlua\@undefined \ifx\Ucharcat\@undefined \ifx\XeTeXinterchartokenstate\@undefined \PackageError{ucharcat} {\string\Ucharcat\space may only be used with xetex and luatex} {skipping package} \else \PackageError{ucharcat} {\string\Ucharcat\space is defined in xetex releases from 2015 only} {skipping package} \fi \fi \expandafter\endinput \fi % \end{macrocode} % % Current latex formats (from 2015/11/01) define an allocator for catcode tables % otherwise just use one (near) the top of the range (hex 7FFF). % % \begin{macrocode} \ifx\newcatcodetable\@undefined \chardef\ucharcat@table"7000 \directlua{tex.enableprimitives("",{"initcatcodetable"})} \initcatcodetable\ucharcat@table \else \newcatcodetable\ucharcat@table \fi % \end{macrocode} % % % lua print function % \begin{macrocode} \directlua{% local nt = newtoken or token function UcharcatLua() local mych = nt.scan_int() local mycat = nt.scan_int() tex.setcatcode(\the\numexpr\ucharcat@table\relax,mych,mycat) tex.sprint(\the\numexpr\ucharcat@table\relax,unicode.utf8.char(mych)) end } % \end{macrocode} % % \TeX\ wrapper. % \begin{macrocode} \def\Ucharcat{\directlua{UcharcatLua()}} % \end{macrocode} % % \begin{macrocode} % % \end{macrocode} % % \Finale %