summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2020-08-29 20:17:19 +0000
committerKarl Berry <karl@freefriends.org>2020-08-29 20:17:19 +0000
commitbcef2848e43c83b6e9eac3afa81f6dd99fea6bd3 (patch)
treeede3418e2dbe0cec66c63a69161b773fc42cb43d
parent7a73a52bad53a24322a5524cb9beb70afd4442c5 (diff)
stricttex (29aug20)
git-svn-id: svn://tug.org/texlive/trunk@56210 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Master/texmf-dist/doc/lualatex/stricttex/README.md34
-rw-r--r--Master/texmf-dist/doc/lualatex/stricttex/stricttex.pdfbin0 -> 55501 bytes
-rw-r--r--Master/texmf-dist/doc/lualatex/stricttex/stricttex.tex132
-rw-r--r--Master/texmf-dist/tex/lualatex/stricttex/stricttex.lua162
-rw-r--r--Master/texmf-dist/tex/lualatex/stricttex/stricttex.sty48
-rwxr-xr-xMaster/tlpkg/bin/tlpkg-ctan-check2
-rwxr-xr-xMaster/tlpkg/libexec/ctan2tds1
-rw-r--r--Master/tlpkg/tlpsrc/collection-luatex.tlpsrc1
-rw-r--r--Master/tlpkg/tlpsrc/stricttex.tlpsrc0
9 files changed, 379 insertions, 1 deletions
diff --git a/Master/texmf-dist/doc/lualatex/stricttex/README.md b/Master/texmf-dist/doc/lualatex/stricttex/README.md
new file mode 100644
index 00000000000..330a8fb4b02
--- /dev/null
+++ b/Master/texmf-dist/doc/lualatex/stricttex/README.md
@@ -0,0 +1,34 @@
+stricttex -- strictly balanced brackets and numbers in command names
+--------------------------------------
+
+The stricttex package is a small, LuaLaTeX-only package providing you with
+three, sometimes useful features:
+ * It allows you to make brackets [...] ``strict'', meaning that
+ each [ must be balanced by a ].
+ * It allows you to use numbers in command names, so
+ that you can do stuff like \newcommand\pi12{\pi_{12}}.
+ * It allows you to use numbers \emph{and} primes in command names,
+ so that you can do stuff like \newcommand\pi'12{\pi '_{12}}.
+
+----------------------------------------------------------------
+stricttex -- strictly balanced brackets and numbers in command names
+Version: 0.1beta
+Maintained by Sebastian Ørsted
+E-mail: sorsted@gmail.com
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------
+
+Copyright (C) 2020 by Sebastian Ørsted <sorsted@gmail.com>
+
+The package is loaded via \usepackage{leftindex}
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License (LPPL), either
+version 1.3c of this license or (at your option) any later
+version. The latest version of this license is in the file:
+
+http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+Sebastian Ørsted. \ No newline at end of file
diff --git a/Master/texmf-dist/doc/lualatex/stricttex/stricttex.pdf b/Master/texmf-dist/doc/lualatex/stricttex/stricttex.pdf
new file mode 100644
index 00000000000..4003955e801
--- /dev/null
+++ b/Master/texmf-dist/doc/lualatex/stricttex/stricttex.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/lualatex/stricttex/stricttex.tex b/Master/texmf-dist/doc/lualatex/stricttex/stricttex.tex
new file mode 100644
index 00000000000..57242faa5c8
--- /dev/null
+++ b/Master/texmf-dist/doc/lualatex/stricttex/stricttex.tex
@@ -0,0 +1,132 @@
+\documentclass[a4paper,article,oneside,10pt]{memoir}
+
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{babel}
+\usepackage{kpfonts,microtype}
+
+\usepackage{listings,xspace,showexpl}
+
+\usepackage[hidelinks]{hyperref}
+
+\frenchspacing
+
+
+\lstset{
+ language=[LaTeX]TeX,
+ basicstyle=\ttfamily\small,
+ commentstyle=\itshape\ttfamily\small,
+ escapechar=\%,
+ alsoletter={\\,0,1,2,3,4,5,6,7,8,9,'},
+ breaklines=true,
+ breakindent={0pt},
+ captionpos=t,
+ tabsize=2,
+ inputencoding=utf8,
+ extendedchars=true,
+ mathescape=true,
+}
+
+\newcommand\strctttex{\texttt{stricttex}\xspace}
+
+\title{\strctttex\ -- strictly balanced brackets and numbers in command names (v0.1$\beta$)}
+\date{\today}
+\author{Sebastian \O rsted (\href{mailto:sorsted@gmail.com}{sorsted@gmail.com})}
+
+\hypersetup{
+ pdfauthor={Sebastian \O rsted},
+ pdftitle={leftindex -- left indices with better spacing},
+}
+
+\begin{document}
+
+\maketitle
+
+\noindent
+The \strctttex package is a small, Lua\LaTeX-only package providing you with three, sometimes useful features:
+\begin{itemize}
+ \item It allows you to make brackets \lstinline![...]! ``strict'', meaning that each~`\lstinline![!
+ must be balanced by a~\lstinline!]!.
+ \item It allows you to use numbers in command names, so
+ that you can do stuff like~\lstinline!\newcommand\pi12{\pi_{12}}!.
+ \item It allows you to use numbers \emph{and} primes in command names,
+ so that you can do stuff like~\lstinline!\newcommand\pi'12{\pi '_{12}}!.
+\end{itemize}
+
+\chapter*{Making brackets strict}
+
+The package provides the commands
+\begin{lstlisting}
+\StrictBracketsOn
+\StrictBracketsOff
+\end{lstlisting}
+Between these two commands,
+all left brackets~\lstinline![! are replaced by~\lstinline![$\{$!,
+and all right brackets~\lstinline!]! by~\lstinline!$\}$]!. This forces the brackets to be properly balanced. This is extremely useful in come packages, such as Seman\TeX, where you can then
+do things that would otherwise cause errors, e.g.
+\begin{lstlisting}[mathescape=false]
+\StrictBracketsOn
+ $ \vf[upper=\vx[upper=2,lower=3]] $
+\StrictBracketsOff
+\end{lstlisting}
+Normal brackets can still be accessed by using the standard \TeX\ commands
+\lstinline!\lbrack! and \lstinline!\rbrack!.
+The replacement algorithm has two important exceptions:
+\begin{itemize}
+ \item \emph{No} replacements apply to the commands~\lstinline!\[...\]!, which can therefore be used as normal.
+ \item If you absolute \emph{need} ordinary brackets,
+ you can write \lstinline!<[>! and~\lstinline!<]>! to access them. This works
+ in all contexts, so e.g. \lstinline!\<[>! and~\lstinline!\<]>! will work
+ just like \lstinline!\[! and~\lstinline!\]!.
+\end{itemize}
+
+\newpage
+
+\chapter*{Allowing numbers (and possibly primes) in commands}
+
+The package provides the commands
+\begin{lstlisting}
+\NumbersInCommandsOn
+\NumbersInCommandsOff
+\NumbersAndPrimesInCommandsOn
+\NumbersAndPrimesInCommandsOff
+\end{lstlisting}
+The first pair of commands allows you to define commands containing numbers. So the following will work:
+\begin{lstlisting}
+\NumbersInCommandsOn
+\newcommand\pi12{\pi_{12}}
+\newcommand\pi13{\pi_{13}}
+\newcommand\pi23{\pi_{23}}
+\newcommand\pi12comma34{\pi_{12,34}}
+\NumbersInCommandsOff
+\end{lstlisting}
+Internally, what happens is that if a command is immediately followed by a number,
+that numbers is replaced by a text string, i.e.
+\lstinline!0!~gets replaced by~\lstinline!numberZERO!,
+\lstinline!1!~gets replaced by~\lstinline!numberONE!,
+etc. These long names have been chosen to prevent name clashes.
+In other words, the code that is eventually passed to \TeX\ is
+\begin{lstlisting}
+\newcommand\pinumberONEnumberTWO{\pi_{12}}
+\newcommand\pinumberONEnumberTHREE{\pi_{13}}
+\newcommand\pinumberTWOnumberTHREE{\pi_{23}}
+\newcommand\pinumberONEnumberTWOcommanumberTHREEnumberFOUR{\pi_{12,34}}
+\end{lstlisting}
+Needless to say, stuff like \lstinline!\kern11pt! will no longer work and will have to be
+replaced by~\lstinline!\kern 11pt!.
+
+The commands \lstinline!\NumbersAndPrimesInCommandsOn! and~\lstinline!\...Off! work almost the same way, except they also allow
+you to use \emph{primes}. So the following will work:
+\begin{lstlisting}
+\NumbersAndPrimesInCommandsOn
+\newcommand\pi'12{\pi '_{12}}
+\NumbersAndPrimesInCommandsOff
+\end{lstlisting}
+Internally, the algorithm works as before, except the prime~\lstinline!'! gets
+replaced by \lstinline!symbolPRIME!. So what is eventually passed to \TeX\ is
+\begin{lstlisting}
+\newcommand\pisymbolPRIMEnumberONEnumberTWO{\pi '_{12}}
+\end{lstlisting}
+
+
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/lualatex/stricttex/stricttex.lua b/Master/texmf-dist/tex/lualatex/stricttex/stricttex.lua
new file mode 100644
index 00000000000..d8dd9621410
--- /dev/null
+++ b/Master/texmf-dist/tex/lualatex/stricttex/stricttex.lua
@@ -0,0 +1,162 @@
+-- Functions for making brackets strict:
+
+stricttexAddBracesToBrackets = function(str)
+ p = str:find('[%[%]]')
+ if p then
+ while true do
+ if str:sub(p-1,p-1) == '\\' then
+ q = str:sub(p+1,-1):find('[%[%]]')
+ if q then
+ p = p + q
+ else
+ break
+ end
+ elseif str:sub(p-1,p+1) == '<[>' or str:sub(p-1,p+1) == '<]>' then
+ str = str:sub(1,p-2) .. str:sub(p,p) .. str:sub(p+2,-1)
+ q = str:sub(p,-1):find('[%[%]]')
+ if q then
+ p = p + q - 1
+ else
+ break
+ end
+ elseif str:sub(p,p) == '[' then
+ str = str:sub(1,p) .. '{' .. str:sub(p+1,-1)
+ q = str:sub(p+2,-1):find('[%[%]]')
+ if q then
+ p = p + q + 1
+ else
+ break
+ end
+ else -- i.e. if str:sub(p,p) == ']'
+ str = str:sub(1,p-1) .. '}' .. str:sub(p,-1)
+ q = str:sub(p+2,-1):find('[%[%]]')
+ if q then
+ p = p + q + 1
+ else
+ break
+ end
+ end
+ end
+ end
+ return str
+end
+
+stricttexStrictBracketsOn = function()
+ luatexbase.add_to_callback(
+ "process_input_buffer", stricttexAddBracesToBrackets , "stricttexStrictBrackets"
+ )
+ ifStricttexStrictBracketsOn = true
+end
+
+stricttexStrictBracketsOff = function()
+ if ifStricttexStrictBracketsOn then
+ luatexbase.remove_from_callback(
+ "process_input_buffer", "stricttexStrictBrackets"
+ )
+ ifStricttexStrictBracketsOn = false
+ else
+ tex.sprint('\\begingroup\\ExplSyntaxOn\\msg_error:nnnn { stricttex } { callback_not_registered } { \\StrictBracketsOn } { \\StrictBracketsOff }\\endgroup')
+ end
+end
+
+-- Functions for numbers (and possibly primes) in command names
+
+stricttexReplaceNumbersByLetters = function(str)
+ str = str:gsub('0','numberZERO')
+ str = str:gsub('1','numberONE')
+ str = str:gsub('2','numberTWO')
+ str = str:gsub('3','numberTHREE')
+ str = str:gsub('4','numberFOUR')
+ str = str:gsub('5','numberFIVE')
+ str = str:gsub('6','numberSIX')
+ str = str:gsub('7','numberSEVEN')
+ str = str:gsub('8','numberEIGHT')
+ str = str:gsub('9','numberNINE')
+ return str
+end
+
+stricttexFormatNumbers = function(str)
+ local p, q = str:find('\\%a+%d')
+ if p then
+ while true do
+ local r,s = str:sub(q,-1):find('%w+') -- ^ in the beginning did not work
+ local newstring = stricttexReplaceNumbersByLetters( str:sub(q,q+s-1) )
+ local l = string.len(newstring)
+ str = str:sub(1, q-1) .. newstring .. str:sub(q+s,-1)
+ local t = str:sub(q+l,-1):find('\\%a+%d')
+ if t then
+ q = q + l + t - 1
+ else
+ break
+ end
+ end
+ end
+ return str
+end
+
+stricttexReplacePrimes = function(str)
+ str = str:gsub("'",'symbolPRIME')
+ return str
+end
+
+stricttexFormatNumbersAndPrimes = function(str)
+ local p, q = str:find("\\%a+[%d']")
+ if p then
+ while true do
+ local r,s = str:sub(q,-1):find("[%w']+") -- ^ in the beginning did not work
+ local newstring = stricttexReplaceNumbersByLetters( str:sub(q,q+s-1) )
+ mewstring = stricttexReplacePrimes( newstring )
+ local l = string.len(newstring)
+ str = str:sub(1, q-1) .. newstring .. str:sub(q+s,-1)
+ local t = str:sub(q+l,-1):find("\\%a+[%d']")
+ if t then
+ q = q + l + t - 1
+ else
+ break
+ end
+ end
+ end
+ return str
+end
+
+stricttexNumbersInCommandsOn = function()
+ if ifStricttexNumbersAndPrimesInCommands then
+ stricttexNumbersAndPrimesInCommandsOff()
+ end
+ luatexbase.add_to_callback(
+ "process_input_buffer", stricttexFormatNumbers , "stricttexNumbersInCommands"
+ )
+ ifStricttexNumbersInCommands = true
+end
+
+stricttexNumbersInCommandsOff = function()
+ if ifStricttexNumbersInCommands then
+ luatexbase.remove_from_callback(
+ "process_input_buffer", "stricttexNumbersInCommands"
+ )
+ ifStricttexNumbersInCommands = false
+ else
+ tex.sprint('\\begingroup\\ExplSyntaxOn\\msg_error:nnnn { stricttex } { callback_not_registered } { \\NumbersInCommandsOn } { \\NumbersInCommandsOff }\\endgroup')
+ end
+end
+
+stricttexNumbersAndPrimesInCommandsOn = function()
+ if ifStricttexNumbersInCommands then
+ stricttexNumbersInCommandsOff()
+ end
+ luatexbase.add_to_callback(
+ "process_input_buffer", stricttexFormatNumbersAndPrimes , "stricttexNumbersAndPrimesInCommands"
+ )
+ ifStricttexNumbersAndPrimesInCommandsOn = true
+end
+
+stricttexNumbersAndPrimesInCommandsOff = function()
+ if ifStricttexNumbersAndPrimesInCommandsOn then
+ luatexbase.remove_from_callback(
+ "process_input_buffer", "stricttexNumbersAndPrimesInCommands"
+ )
+ ifStricttexNumbersAndPrimesInCommandsOn = false
+ else
+ tex.sprint('\\begingroup\\ExplSyntaxOn\\msg_error:nnnn { stricttex } { callback_not_registered } { \\NumbersAndPrimesInCommandsOn } { \\NumbersAndPrimesInCommandsOff }\\endgroup')
+ end
+end \ No newline at end of file
diff --git a/Master/texmf-dist/tex/lualatex/stricttex/stricttex.sty b/Master/texmf-dist/tex/lualatex/stricttex/stricttex.sty
new file mode 100644
index 00000000000..8a3e9874dd1
--- /dev/null
+++ b/Master/texmf-dist/tex/lualatex/stricttex/stricttex.sty
@@ -0,0 +1,48 @@
+\ProvidesExplPackage{stricttex}{2020/07/28}{0.1beta}{}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% %
+% stricttex -- strictly paired brackets and numbers in command names %
+% https://ctan.org/pkg/semantex %
+% (C) 2020 Sebastian Ørsted %
+% sorsted@gmail.com %
+% %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\msg_new:nnn { stricttex } { not_luatex } { This~package~only~works~with~LuaTeX;~the~current~TeX~run~has~been~terminated. }
+
+\msg_new:nnn { stricttex } { callback_not_registered } { Found~#2 with~no~preceding~#1 }
+
+\sys_if_engine_luatex:F { \msg_fatal:nn { stricttex } { not_luatex } }
+
+\lua_now:e { require('stricttex.lua') }
+
+\cs_new_protected:Npn\StrictBracketsOn
+{
+ \lua_now:e { stricttexStrictBracketsOn() }
+}
+
+\cs_new_protected:Npn\StrictBracketsOff
+{
+ \lua_now:e { stricttexStrictBracketsOff() }
+}
+
+\cs_new_protected:Npn\NumbersInCommandsOn
+{
+ \lua_now:e { stricttexNumbersInCommandsOn() }
+}
+
+\cs_new_protected:Npn\NumbersInCommandsOff
+{
+ \lua_now:e { stricttexNumbersInCommandsOff() }
+}
+
+\cs_new_protected:Npn\NumbersAndPrimesInCommandsOn
+{
+ \lua_now:e { stricttexNumbersAndPrimesInCommandsOn() }
+}
+
+\cs_new_protected:Npn\NumbersAndPrimesInCommandsOff
+{
+ \lua_now:e { stricttexNumbersAndPrimesInCommandsOff() }
+} \ No newline at end of file
diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check
index 7863ba34fb2..fa07f7cab80 100755
--- a/Master/tlpkg/bin/tlpkg-ctan-check
+++ b/Master/tlpkg/bin/tlpkg-ctan-check
@@ -693,7 +693,7 @@ my @TLP_working = qw(
stdclsdv stdpage stealcaps steinmetz
stellenbosch step stex
stickstoo stix stix2-otf stix2-type1 stmaryrd storebox storecmd
- stringenc stringstrings structmech struktex
+ stricttex stringenc stringstrings structmech struktex
sttools stubs studenthandouts sty2dtx suanpan
subdocs subdepth subeqn subeqnarray
subfig subfigmat subfigure subfiles subfloat substances
diff --git a/Master/tlpkg/libexec/ctan2tds b/Master/tlpkg/libexec/ctan2tds
index 7fba8680a4f..55fc529d9fe 100755
--- a/Master/tlpkg/libexec/ctan2tds
+++ b/Master/tlpkg/libexec/ctan2tds
@@ -2115,6 +2115,7 @@ $standardtex
'splitindex', 'splitindex\.tex|' . $standardtex,
'spotcolor', 'spotcolor.*\.tex|' . $standardtex,
'startex', '\.(tex|stx|lan)$',
+ 'stricttex', '\.lua|' . $standardtex,
'subfig', '\.sty|[^c]\.cfg', # not ltxdoc.cfg, would be system-wide
'subfigure', '\.sty|[^c]\.cfg', # not ltxdoc.cfg, would be system-wide
'syntax', 'syntax\.tex',
diff --git a/Master/tlpkg/tlpsrc/collection-luatex.tlpsrc b/Master/tlpkg/tlpsrc/collection-luatex.tlpsrc
index 7b91b79eecb..15ca897da1d 100644
--- a/Master/tlpkg/tlpsrc/collection-luatex.tlpsrc
+++ b/Master/tlpkg/tlpsrc/collection-luatex.tlpsrc
@@ -55,4 +55,5 @@ depend placeat
depend plantuml
depend selnolig
depend spelling
+depend stricttex
depend typewriter
diff --git a/Master/tlpkg/tlpsrc/stricttex.tlpsrc b/Master/tlpkg/tlpsrc/stricttex.tlpsrc
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/Master/tlpkg/tlpsrc/stricttex.tlpsrc