% \iffalse meta-comment % % File: unitipa.dtx % --------------------------------------------------------------------------- % Package: unitipa % Author: Niranjan % Version: 0.3 (3 April, 2021) % Description: TIPA typefaces with Unicode characters. % Repository: https://gitlab.com/niruvt/unitipa % Bug tracker: https://gitlab.com/niruvt/unitipa/-/issues % License: The LaTeX Project Public License v1.3c or later. % --------------------------------------------------------------------------- % This work may be distributed and/or modified under the conditions of the % LaTeX Project Public License, either version 1.3c 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. % % This work has the LPPL maintenance status `maintained'. % % The Current Maintainer of this work is Niranjan. % % This work consists of the files unitipa.dtx % unitipa.ins % and the derived file unitipa.sty. % \fi % \iffalse %<*internal> \iffalse % %<*readme> -------------------------------------------------------------------------- Package: unitipa Author: Niranjan Version: 0.3 (3 April, 2021) Description: TIPA typefaces with Unicode characters. Repository: https://gitlab.com/niruvt/unitipa Bug tracker: https://gitlab.com/niruvt/unitipa/-/issues License: The LaTeX Project Public License v1.3c or later. -------------------------------------------------------------------------- % %<*internal> \fi % %<*driver|package> \def\unitipaname{unitipa} \def\unitipaversion{0.3} \def\unitipadate{2021/04/03} \def\unitipadescription{TIPA typefaces with Unicode characters.} % %<*driver> \documentclass{l3doc} \usepackage{tipa} \usepackage{graphicx} \usepackage{unitipa} \usepackage{hyperref} \usepackage{xcolor} \hypersetup{% colorlinks,% linkcolor=red!60!black,% citecolor=green!60!black,% urlcolor=blue!60!black% }% \usepackage{fontawesome5} \begin{document} \DocInput{\unitipaname.dtx} \end{document} % % \fi % \title{The \pkg{\unitipaname} package} % \author{Niranjan} % \date^^A % {^^A % Version \unitipaversion\ --- \unitipadate\\[1ex]^^A % {\small\faIcon{link}\quad\url{https://ctan.org/pkg/unitipa}}\\^^A % {\small\faIcon{gitlab}\quad\url{https://gitlab.com/niruvt/unitipa}}^^A % } % \maketitle % % This package converts Unicode characters into TIPA commands, which gives us % \pkg{tipa} typefaces, without actually learning the \pkg{tipa} commands in % much details. This package needs Lua\LaTeX\ as the compiler for correctly % typesetting the IPA diacritics. TIPA was designed to match with the Computer % Modern design, no other IPA font matches with traditional \LaTeX\ font. This % package is helpful for getting the beautiful \pkg{tipa} shapes with Unicode % characters. This package assumes that the user knows how to type IPA % Unicode. Following is the list of symbols that \textit{cannot} be used with % the traditional \LaTeX\ font. Every other symbol in the IPA chart is present % in the current \LaTeX\ font. % \begin{description} % \item[Plosives] ʈ ɖ ɟ ɢ ʔ % \item[Nasals] ɱ ɳ ɲ\footnote{Added in v0.2} ɴ % \item[Trills] ʙ ʀ % \item[Taps or flaps] ⱱ ɾ ɽ % \item[Fricatives] ɸ β θ ʃ ʒ ʂ ʐ ɣ χ ʁ ʕ ɦ % \item[Lateral fricatives] ɬ ɮ % \item[Approximants] ʋ ɹ ɻ ɰ % \item[Lateral approximants] ɭ ʎ ʟ % \item[Affricates] ʧ ʤ ʦ ʣ % \item[Close vowels] ɨ ʉ ɯ % \item[Near-close vowels] ɪ ʏ ʊ % \item[Close-mid vowels] ɵ ɤ % \item[Open-mid vowels] ɛ ɜ ɞ ʌ ɔ % \item[Near-open vowels] ɐ ɶ ɒ % \item[Open vowels] ɑ\footnote{Reported \textit{\&} added by Heller, Thomas in % v0.2. % % Bug report - \url{https://gitlab.com/niruvt/unitipa/-/issues/1} % % MR - \url{https://gitlab.com/niruvt/unitipa/-/merge_requests/1} % } % \item[Clicks] ʘ ǀ ǃ ǂ ǁ % \item[Voiced Implosives] ɓ ɗ ʄ ɠ ʛ % \item[Ejective] ʼ % \item[Suprasegmentals] ˈ ˌ ː ˑ % \item[Other symbols] ʍ ɥ ʜ ʢ ʡ ɕ ʑ ɺ ɧ % \item[Dependent diacritics] k̥ e̬ o̹ o̜ u̟ l̠ e̽ m̩ a̯ b̤ t̼ l̴ ɛ̝ e̞ e̘ e̙ t̪ t̺ n̻ p̚ % \item[Independent diacritics] kʰ gʱ kʷ cʲ kˠ pˤ % \item[Tie bars] t͜s k͡p % \item[Tones] ꜜ ꜛ a᷄ e᷅ e᷈ % \end{description} % \begin{documentation} % \section{Package options} % \begin{function}{nodiacritics} % If you are very sure that you don't need any IPA diacritics in your document, % you can load the package with this option. If this option is loaded, package % can be compiled with other compilers too, but no IPA diacritic will be % printed. % \end{function} % \begin{function}{ipafont} % IPA character [ⱱ] is not available in \pkg{tipa}, but for the convenience of % users, this character is coded with Doulos SIL as it seemed to me the closest % match to \pkg{tipa} typeface. If you don't have this font, please install % package \pkg{\href{https://ctan.org/pkg/doulossil}{doulossil}} or download the % font from \href{https://software.sil.org/doulos/}{here}. If users want to % change the font used for this character, they can simply add the font name as % the value to this option. % \begin{syntax} % ipafont=\meta{font name} % \end{syntax} % \end{function} % \end{documentation} % \begin{implementation} % \section{Implementation} % \begin{macrocode} %<@@=unitipa> %<*package> % \end{macrocode} % \begin{macrocode} \ProvidesPackage{unitipa}[2021/04/03 v0.3 TIPA typefaces with unicode characters] \RequirePackage{tipa} % \end{macrocode} % Provide package with its basic information and load package \pkg{tipa}. % \begin{macrocode} \RequirePackage{graphicx} % \end{macrocode} % Package \pkg{graphicx} is needed for printing [ɞ] correctly. See line no.\ % 295. % \begin{macrocode} \RequirePackage{newunicodechar} \RequirePackage{fontspec} \RequirePackage{pgfkeys} \pgfkeys{% unitipa/.is family, unitipa/.cd,% ipafont/.code={\setfontfamily{\ipa}{#1}},% ipafont=DoulosSIL% }% \DeclareTextFontCommand{\ipatext}{\ipa} \def\unitipa@ipafont#1{\pgfkeys{unitipa/.cd,#1}} \DeclareOption*{\expandafter\unitipa@ipafont\expandafter{\CurrentOption}} % \end{macrocode} % Option \verb|ipafont| provided using \pkg{pgfkeys}. % \begin{macrocode} \newif\ifnodiacritics \nodiacriticsfalse \DeclareOption{nodiacritics}{\nodiacriticstrue} \ProcessOptions\relax \ifnodiacritics \relax \else \RequirePackage{iftex} \RequirePackage{luacode} \RequireLuaTeX %% Dependent diacritic marks \begin{luacode} function voiceless ( s ) s = unicode.utf8.gsub ( s , '(%a)̥', '\\textsubring{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", voiceless, "voiceless")} \begin{luacode} function voiced ( s ) s = unicode.utf8.gsub ( s , '(%a)̬', '\\textsubwedge{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", voiced, "voiced")} \begin{luacode} function morerounded ( s ) s = unicode.utf8.gsub ( s , '(%a)̹', '\\textsubrhalfring{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", morerounded, "morerounded")} \begin{luacode} function lessrounded ( s ) s = unicode.utf8.gsub ( s , '(%a)̜', '\\textsublhalfring{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", lessrounded, "lessrounded")} \begin{luacode} function advanced ( s ) s = unicode.utf8.gsub ( s , '(%a)̟', '\\textsubplus{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", advanced, "advanced")} \begin{luacode} function retracted ( s ) s = unicode.utf8.gsub ( s , '(%a)̠', '\\textsubbar{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", retracted, "retracted")} \begin{luacode} function midcentralized ( s ) s = unicode.utf8.gsub ( s , '(%a)̽', '\\textovercross{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", midcentralized, "midcentralized")} \begin{luacode} function syllabic ( s ) s = unicode.utf8.gsub ( s , '(%a)̩', '\\textsyllabic{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", syllabic, "syllabic")} \begin{luacode} function nonsyllabic ( s ) s = unicode.utf8.gsub ( s , '(%a)̯', '\\textsubarch{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", nonsyllabic, "nonsyllabic")} \begin{luacode} function breathyvoiced ( s ) s = unicode.utf8.gsub ( s , '(%a)̤', '\\textsubumlaut{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", breathyvoiced, "breathyvoiced")} \begin{luacode} function linguolabial ( s ) s = unicode.utf8.gsub ( s , '(%a)̼', '\\textseagull{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", linguolabial, "linguolabial")} \begin{luacode} function velarized ( s ) s = unicode.utf8.gsub ( s , '(%a)̴', '\\textsuperimposetilde{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", velarized, "velarized")} \begin{luacode} function raised ( s ) s = unicode.utf8.gsub ( s , '(%a)̝', '\\textraising{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", raised, "raised")} \begin{luacode} function lowered ( s ) s = unicode.utf8.gsub ( s , '(%a)̞', '\\textlowering{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", lowered, "lowered")} \begin{luacode} function advancedtr ( s ) s = unicode.utf8.gsub ( s , '(%a)̘', '\\textadvancing{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", advancedtr, "advancedtr")} \begin{luacode} function retractedtr ( s ) s = unicode.utf8.gsub ( s , '(%a)̙', '\\textretracting{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", retractedtr, "retractedtr")} \begin{luacode} function dental ( s ) s = unicode.utf8.gsub ( s , '(%a)̪', '\\textsubbridge{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", dental, "dental")} \begin{luacode} function apical ( s ) s = unicode.utf8.gsub ( s , '(%a)̺', '\\textinvsubbridge{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", apical, "apical")} \begin{luacode} function laminal ( s ) s = unicode.utf8.gsub ( s , '(%a)̻', '\\textsubsquare{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", laminal, "laminal")} \begin{luacode} function unaudible ( s ) s = unicode.utf8.gsub ( s , '(%a)̚', '%1\\textcorner' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", unaudible, "unaudible")} %% Tie bars \begin{luacode} function tiebarup ( s ) s = unicode.utf8.gsub ( s , '(%a)͡(%a)', '\\texttoptiebar{%1%2}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", tiebarup, "tiebarup")} \begin{luacode} function tiebardown ( s ) s = unicode.utf8.gsub ( s , '(%a)͜(%a)', '\\textbottomtiebar{%1%2}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", tiebardown, "tiebardown")} \begin{luacode} function risefall ( s ) s = unicode.utf8.gsub ( s , '(%a)᷈', '\\textrisefall{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", risefall, "risefall")} \begin{luacode} function rising ( s ) s = unicode.utf8.gsub ( s , '(%a)᷄', '\\texthighrise{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", rising, "rising")} \begin{luacode} function falling ( s ) s = unicode.utf8.gsub ( s , '(%a)᷅', '\\textlowrise{%1}' ) return s end \end{luacode} \directlua{luatexbase.add_to_callback("process_input_buffer", falling, "falling")} \fi % \end{macrocode} % Option \verb|nodiacritics| provided for using the package without % Lua\LaTeX. Enabling this option won't print any diacritics. Help from % Samcarter and Mico Loretan on different platforms\footnote{Samcarter's % \href{https://topanswers.xyz/tex?q=1332\#a1577}{answer} on TopAnswer \& Mico % Loretan's \href{https://tex.stackexchange.com/a/563447/174620}{answer} on % TeX.SE.} gave a right direction to this code. % \begin{macrocode} %% Pulmonic Consonants %% Plosives \newunicodechar{ʈ}{\textrtailt} \newunicodechar{ɖ}{\textrtaild} \newunicodechar{ɟ}{\textbardotlessj} \newunicodechar{ɢ}{\textscg} \newunicodechar{ʔ}{\textglotstop} %% Nasals \newunicodechar{ɱ}{\textltailm} \newunicodechar{ɳ}{\textrtailn} \newunicodechar{ɲ}{\textltailn} %% Added in v0.2 \newunicodechar{ɴ}{\textscn} %% Trills \newunicodechar{ʙ}{\textscb} \newunicodechar{ʀ}{\textscr} %% Taps or flaps \newunicodechar{ⱱ}{\ipatext{ⱱ}} %% Sorry for the bad typography! \newunicodechar{ɾ}{\textfishhookr} \newunicodechar{ɽ}{\textrtailr} %% Fricatives \newunicodechar{ɸ}{\textphi} \newunicodechar{β}{\textbeta} \newunicodechar{θ}{\texttheta} \newunicodechar{ʃ}{\textesh} \newunicodechar{ʒ}{\textyogh} \newunicodechar{ʂ}{\textrtails} \newunicodechar{ʐ}{\textrtailz} \newunicodechar{ʝ}{\textctj} \newunicodechar{ɣ}{\textgamma} \newunicodechar{χ}{\textchi} \newunicodechar{ʁ}{\textinvscr} \newunicodechar{ʕ}{\textrevglotstop} \newunicodechar{ɦ}{\texthth} %% Lateral fricatives \newunicodechar{ɬ}{\textbeltl} \newunicodechar{ɮ}{\textlyoghlig} %% Approximants \newunicodechar{ʋ}{\textscriptv} \newunicodechar{ɹ}{\textturnr} \newunicodechar{ɻ}{\textturnrrtail} \newunicodechar{ɰ}{\textturnmrleg} %% Lateral approximants \newunicodechar{ɭ}{\textrtaill} \newunicodechar{ʎ}{\textturny} \newunicodechar{ʟ}{\textscl} %% Affricates \newunicodechar{ʧ}{\textteshlig} \newunicodechar{ʤ}{\textdyoghlig} \newunicodechar{ʦ}{\texttslig} \newunicodechar{ʣ}{\textdzlig} %% Vowels %% Close \newunicodechar{ɨ}{\textbari} \newunicodechar{ʉ}{\textbaru} \newunicodechar{ɯ}{\textturnm} %% Near-close \newunicodechar{ɪ}{\textsci} \newunicodechar{ʏ}{\textscy} \newunicodechar{ʊ}{\textupsilon} %% Close-mid \newunicodechar{ɵ}{\textbaro} \newunicodechar{ɤ}{\textramshorns} %% Open-mid \newunicodechar{ɛ}{\textepsilon} \newunicodechar{ɜ}{\textrevepsilon} \newunicodechar{ɞ}{\reflectbox{\textcloseepsilon}} %% Latest changes \newunicodechar{ʌ}{\textturnv} \newunicodechar{ɔ}{\textopeno} %% Near-open \newunicodechar{ɐ}{\textturna} \newunicodechar{ɶ}{\textscoelig} \newunicodechar{ɒ}{\textturnscripta} %% Open %% Reported and added by Heller, Thomas on 2021/03/13 %% Bug report - https://gitlab.com/niruvt/unitipa/-/issues/1 %% MR - https://gitlab.com/niruvt/unitipa/-/merge_requests/1 \newunicodechar{ɑ}{\textscripta} %% Non-Pulmonic \newunicodechar{ʘ}{\textbullseye} \newunicodechar{ǀ}{\textpipe} \newunicodechar{ǃ}{\textipa{!}} \newunicodechar{ǂ}{\textdoublebarpipe} \newunicodechar{ǁ}{\textdoublepipe} %% Voiced Implosives \newunicodechar{ɓ}{\texthtb} \newunicodechar{ɗ}{\texthtd} \newunicodechar{ʄ}{\texthtbardotlessj} \newunicodechar{ɠ}{\texthtg} \newunicodechar{ʛ}{\texthtscg} \newunicodechar{ʼ}{'} %% Suprasegmentals \newunicodechar{ˈ}{\textprimstress} \newunicodechar{ˌ}{\textsecstress} \newunicodechar{ː}{\textlengthmark} \newunicodechar{ˑ}{\texthalflength} \newunicodechar{ʍ}{\textturnw} \newunicodechar{ɥ}{\textturnh} \newunicodechar{ʜ}{\textsch} \newunicodechar{ʢ}{\textbarrevglotstop} \newunicodechar{ʡ}{\textbarglotstop} \newunicodechar{ɕ}{\textctc} \newunicodechar{ʑ}{\textctz} \newunicodechar{ɺ}{\textturnlonglegr} \newunicodechar{ɧ}{\texththeng} %% Diacritics \newunicodechar{ʰ}{\textsuperscript{h}} \newunicodechar{ʱ}{\textsuperscript{ɦ}} \newunicodechar{ʷ}{\textsuperscript{w}} \newunicodechar{ʲ}{\textsuperscript{j}} \newunicodechar{ˠ}{\textsuperscript{ɣ}} \newunicodechar{ˤ}{\textsuperscript{ʕ}} %% Tones independent diacritics \newunicodechar{ꜜ}{\textdownstep} \newunicodechar{ꜛ}{\textupstep} %% \newunicodechar{︎↗}{\textglobrise} %% Not working :'( %% \newunicodechar{↘}{\textglobfall} %% Need help here % \end{macrocode} % \begin{macrocode} % % \end{macrocode} % \end{implementation} % \RecordChanges % \changes{v0.1}{2020/09/21}{Initial version} % \changes{v0.2}{2021/03/13}{Added characters `ɑ' and `ɲ'} % \changes{v0.3}{2021/04/03}{Updated repository path} % \PrintChanges % \Finale