diff options
Diffstat (limited to 'macros/luatex/latex/luaquotes/luaquotes.sty')
-rw-r--r-- | macros/luatex/latex/luaquotes/luaquotes.sty | 310 |
1 files changed, 310 insertions, 0 deletions
diff --git a/macros/luatex/latex/luaquotes/luaquotes.sty b/macros/luatex/latex/luaquotes/luaquotes.sty new file mode 100644 index 0000000000..f753df8183 --- /dev/null +++ b/macros/luatex/latex/luaquotes/luaquotes.sty @@ -0,0 +1,310 @@ +\def\luaquotesversionnumber{1.0.0} +\ProvidesPackage{luaquotes} + [2022/08/01\luaquotesversionnumber smart quotes with lua] + % !TeX program = lualatex +% !TeX encoding = utf8 +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Elijah Z Granet + + %%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% to show the package only works with Lua +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% + \RequirePackage{iftex} + \ifPDFTeX { + \PackageError{luaquotes} + {You are using pdfTeX but this package only works + \MessageBreak with LuaTeX}{} + } +\else\ifXeTeX{ \PackageError{luaquotes} + {You are using XeTeX but this package only works + \MessageBreak with LuaTeX}{} +}\fi\fi +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Dependency +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% + \RequirePackage{luacode} + %%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% fontspec for the auxiliary +% quotes where tligs need +% to be disabled +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% + \RequirePackage{fontspec} + %%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% removing the effects for monospace +%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{luacode} +local uchar = unicode.utf8.char + fonts.handlers.otf.addfeature{ + name = "qtbye", + type = "substitution", + data = + { + “ = 0x0022, +” = 0x0022, +’ = 0x0027, +« = 0x0022, +» = 0x0022, +‹ = 0x0027, +› = 0x0027 + }, + } + \end{luacode} +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Code here and throughout similar +%functions partly adapted from TeX.SE user +% Mico +% https://tex.stackexchange.com/questions/499953/how-to-generate-correct-single-and-double-quotes-in-tex +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\luaexec{ +function doublequotes ( s ) + return ( s:gsub ( '"(..-)"' , "“\%1”" ) ) + end} + + %%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Assuming ' at the start of the line means an opening quotation mark not an apostrophe +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +\luaexec{function singlequotelinestart ( s ) + return (s:gsub ("^'","‘" ) ) + end} + +\luaexec{function singlequotes ( s ) + return ( s:gsub ( " '"," ‘" ) ) + end} +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% activation and deactivation +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand\doublequoteson{\directlua{luatexbase.add_to_callback ( + "process_input_buffer" , + doublequotes , + "doublequotes" )}} +\newcommand\doublequotesoff{\directlua{luatexbase.remove_from_callback ( + "process_input_buffer" , + "doublequotes" )}} +\newcommand\singlequotelinestarton{\directlua{ +luatexbase.add_to_callback ( + "process_input_buffer" , singlequotelinestart , "singlequotelinestart" ) + }} +\newcommand\singlequotelinestartoff{\directlua{ +luatexbase.remove_from_callback ( + "process_input_buffer" , "singlequotelinestart" ) + }} +\newcommand\singlequoteson{\directlua{ +luatexbase.add_to_callback ( + "process_input_buffer" , singlequotes , "singlequotes" ) + }} +\newcommand\singlequotesoff{\directlua{luatexbase.remove_from_callback ( + "process_input_buffer" , "singlequotes" )}} +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% global functions, useful for things like this +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% + \newcommand{\smartquotes}{% +\doublequoteson% +\singlequotelinestarton% +\singlequoteson} + \newcommand{\dumbquotes}{ + \doublequotesoff + \singlequotelinestartoff + \singlequotesoff} + + \DeclareOption{en}{ +\AtBeginDocument{\smartquotes} +\renewcommand{\texttt}[1]{{\ttfamily\addfontfeature{RawFeature={+qtbye,-tlig}} #1}} + } + +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% auxiliary punctuation +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Essentially to be used where the +% thing fails to provide the +% quotation or +% quote like punctuation +% needed +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% German quotations +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand{\desingle}{{\addfontfeature{RawFeature={-qtbye,-tlig}}\symbol{"201A}}} +\newcommand{\dedouble}{{\addfontfeature{RawFeature={-qtbye,-tlig}}\symbol{"201E}}} +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% backtick +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand{\bcktck}{{\addfontfeature{RawFeature={-qtbye,-tlig}}`}} +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Straight double +% and single quotes +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newcommand{\dqone}{{\addfontfeature{RawFeature={-qtbye,-tlig}}\symbol{"0027}}} +\newcommand{\dqtwo}{{\addfontfeature{RawFeature={-qtbye,-tlig}}\symbol{"0022}}} +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Prime, mostly for +% Feet and inches +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand{\lqprime}{′} +\newcommand{\lqdoubleprime}{″} +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% The Okina, for typing +% Hawaiʻi +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand{\okina}{ʻ} +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% The individual smart quotes +% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand{\sqtwoleft}{{\addfontfeature{RawFeature={-qtbye,-tlig}}“}} +\newcommand{\sqtworight}{{\addfontfeature{RawFeature={-qtbye,-tlig}}”}} +\newcommand{\sqoneright}{{\addfontfeature{RawFeature={-qtbye,-tlig}}’}} +\newcommand{\apost}{{\addfontfeature{RawFeature={-qtbye,-tlig}}’}} +\newcommand{\sqoneleft}{{\addfontfeature{RawFeature={-qtbye,-tlig}}‘}} +\newcommand{\glmtl}{{\addfontfeature{RawFeature={-qtbye,-tlig}}«\,}} +\newcommand{\glmtr}{{\addfontfeature{RawFeature={-qtbye,-tlig}}\,»}} +\newcommand{\sglmtl}{{\addfontfeature{RawFeature={-qtbye,-tlig}}‹\,}} +\newcommand{\sglmtr}{{\addfontfeature{RawFeature={-qtbye,-tlig}}\,›}} +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% DEUTSCH +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +\luaexec{function dedoublequotes ( s ) + return ( s:gsub ( '"(..-)"' , "„\%1“" ) ) + end} +\luaexec{function desinglequotelinestart ( s ) + return (s:gsub ("^'","‚" ) ) + end} +\luaexec{function desinglequotesclose( s ) +return ( s:gsub ( " '(..-)'", " ‚\%1`" ) ) + end} + +%% Two utility macros to activate/deactivate the Lua function: +\newcommand\dedoublequoteson{\directlua{luatexbase.add_to_callback ( + "process_input_buffer" , dedoublequotes , "dedoublequotes" )}} +\newcommand\dedoublequotesoff{\directlua{luatexbase.remove_from_callback ( + "process_input_buffer" , "dedoublequotes" )}} +\newcommand\desinglequotelinestarton{\directlua{luatexbase.add_to_callback ( + "process_input_buffer" , desinglequotelinestart , "desinglequotelinestart" )}} +\newcommand\desinglequotelinestartoff{\directlua{luatexbase.remove_from_callback ( + "process_input_buffer" , "desinglequotelinestart" )}} + \newcommand\desinglequotescloseon{\directlua{luatexbase.add_to_callback ( + "process_input_buffer" , desinglequotesclose , "desinglequotesclose" )}} +\newcommand\desinglequotescloseoff{\directlua{luatexbase.remove_from_callback ( + "process_input_buffer" , "desinglequotesclose" )}} + \newcommand{\desmartquotes}{\dedoublequoteson +\desinglequotelinestarton +\desinglequoteson +\desinglequotescloseon} + \newcommand{\dedumbquotes}{\dedoublequotesoff +\desinglequotelinestartoff +\desinglequotesoff +\desinglequotescloseoff} + \DeclareOption{de}{ + +\AtBeginDocument{\desmartquotes} +\renewcommand{\texttt}[1]{{\ttfamily\addfontfeature{RawFeature={+qtbye,-tlig}} #1}} + + +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Français +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +\luaexec{function frdoublequotes ( s ) + return ( s:gsub ( '"(..-)"' , "«\\,\%1\\,»" ) ) + end} + + +\luaexec{function frsinglequotelinestart ( s ) + return (s:gsub ("^'","'" ) ) + end} +\luaexec{function frsinglequotesclose( s ) +return ( s:gsub ( " '(..-)'", " ‹\\,\%1\\,›" ) ) + end} + +%% Two utility macros to activate/deactivate the Lua function: +\newcommand\frdoublequoteson{\directlua{luatexbase.add_to_callback ( + "process_input_buffer" ,frdoublequotes , "frdoublequotes" )}} +\newcommand\frdoublequotesoff{\directlua{luatexbase.remove_from_callback ( + "process_input_buffer" , "frdoublequotes" )}} +\newcommand\frsinglequotelinestarton{\directlua{luatexbase.add_to_callback ( + "process_input_buffer" ,frsinglequotelinestart , "frsinglequotelinestart" )}} +\newcommand\frsinglequotelinestartoff{\directlua{luatexbase.remove_from_callback ( + "process_input_buffer" , "frsinglequotelinestart" )}} + \newcommand\frsinglequotescloseon{\directlua{luatexbase.add_to_callback ( + "process_input_buffer" ,frsinglequotesclose , "frsinglequotesclose" )}} +\newcommand\frsinglequotescloseoff{\directlua{luatexbase.remove_from_callback ( + "process_input_buffer" , "frsinglequotesclose" )}} + \newcommand{\frsmartquotes}{\frdoublequoteson +\frsinglequotelinestarton +\frsinglequotescloseon} + \newcommand{\frdumbquotes}{\frdoublequotesoff +\frsinglequotelinestartoff +\frsinglequotescloseoff} + \DeclareOption{fr}{ + +\AtBeginDocument{\frsmartquotes} +\renewcommand{\texttt}[1]{{\ttfamily\addfontfeature{RawFeature={+qtbye,-tlig}} #1}} + + +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Default option is English +%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%% +\ExecuteOptions{en}% + \ProcessOptions* + + + + |