% \iffalse meta-comment % A LaTeX Class and Package for the Smultiling Glossary % Copyright (c) 2009 Michael Kohlhase, all rights reserved % this file is released under the % LaTeX Project Public License (LPPL) % % The original of this file is in the public repository at % http://github.com/KWARC/sTeX/ % \fi % % \iffalse %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\ProvidesPackage{smultiling}[2016/04/07 v0.1 Multilingual Support for sTeX] % %<*driver> \documentclass{ltxdoc} \usepackage{url,array,omdoc,omtext,float} \usepackage[show]{ed} \usepackage[hyperref=auto,style=alphabetic]{biblatex} \addbibresource{kwarcpubs.bib} \addbibresource{extpubs.bib} \addbibresource{kwarccrossrefs.bib} \addbibresource{extcrossrefs.bib} \usepackage{stex-logo} \usepackage{ctangit} \usepackage{hyperref} \makeindex \floatstyle{boxed} \newfloat{exfig}{thp}{lop} \floatname{exfig}{Example} \def\tracissue#1{\cite{sTeX:online}, \hyperlink{hstp://trac.kwarc.info/sTeX/ticket/#1}{issue #1}} \def\smglom{\textsf{SMGloM}\xspace} \def\omdoc{\textsf{OMDoc}\xspace} \def\latexml{{\LaTeX}ML\xspace} \def\lmh{\textsf{lmh}\xspace} \begin{document}\DocInput{smultiling.dtx}\end{document} % % \fi % %\CheckSum{189} % % \changes{v0.1}{2014/04/19}{First Version} % % % \MakeShortVerb{\|} % % \def\omdoc{OMDoc} % \def\latexml{{\LaTeX}ML} % \title{{\texttt{smultiling.sty}}: Multilinguality Support for \protect\sTeX} % \author{Michael Kohlhase, Deyan Ginev\\ % Jacobs University, Bremen\\ % \url{http://kwarc.info/kohlhase}} % \maketitle % % \begin{abstract} % The |smultiling| package is part of the \sTeX collection, a version of {\TeX/\LaTeX} % that allows to markup {\TeX/\LaTeX} documents semantically without leaving the % document format, essentially turning {\TeX/\LaTeX} into a document format for % mathematical knowledge management (MKM). % % The |smultiling| package adds multilinguality support for \sTeX, the idea is that % multilingual modules in \sTeX consist of a module signature together with multiple % language bindings that inherit symbols from it, which also account for cross-language % coordination. % \end{abstract} % %\tableofcontents\newpage % %\begin{omgroup}[id=sec:STR]{Introduction} % We have been using \sTeX as the encoding for the Semantic Multilingual Glossary of % Mathematics (\smglom; see~\cite{IanJucKoh:sps14}). The \smglom data model has been % taxing the representational capabilities of \sTeX with respect to multilingual support % and verbalization definitions; see~\cite{Kohlhase:dmesmgm14}, which we assume as % background reading for this note. % % \begin{omgroup}{\protect\sTeX Module Signatures} % (monolingual) \sTeX had the intuition that the symbol definitions (|\symdef| and % |\symvariant|) are interspersed with the text and we generate \sTeX module signatures % (SMS |*.sms| files) from the \sTeX files. The SMS duplicate ``formal'' information % from the ``narrative'' \sTeX files. In the \smglom, we extend this idea by making the % the SMS primary objects that contain the language-independent part of the formal % structure conveyed by the \sTeX documents and there may be multiple narrative % ``language bindings'' that are translations of each other -- and as we do not want to % duplicate the formal parts, those are inherited from the SMS rather than written down % in the language binding itself. So instead of the traditional monolingual markup in % Figure~\ref{fig:stex-monolingual}, we we now advocate the divided style in % Figure~\ref{fig:stex-multiling}. % % \begin{exfig} % \begin{verbatim} % \begin{module}[id=foo] % \symdef{bar}{BAR} % \begin{definition}[for=bar] % A \defiii{big}{array}{raster} ($\bar$) is a\ldots, it is much bigger % than a \defiii[sar]{small}{array}{raster}. % \end{definition} % \end{module} % \end{verbatim}\vspace{-2em} % \caption{A module with definition in monolingual \protect\sTeX}\label{fig:stex-monolingual} % \end{exfig} % % \begin{exfig} % \begin{verbatim} % \usepackage{multiling} % \begin{modsig}{foo} % \symdef{bar}{BAR} % \symi{sar} % \end{modsig} % % \begin{modnl}[creators=miko,primary]{foo}{en} % \begin{definition} % A \defiii[bar]{big}{array}{raster} ($\bar$) is a\ldots, it is much bigger % than a \defiii[sar]{small}{array}{raster}. % \end{definition} % \end{modnl} % % \begin{modnl}[creators=miko]{foo}{de} % \begin{definition} % Ein \defiii[bar]{gro"ses}{Feld}{Raster} ($\bar$) ist ein\ldots, es % ist viel gr"o"ser als ein \defiii[sar]{kleines}{Feld}{Raster}. % \end{definition} % \end{modnl} % \end{verbatim}\vspace{-2em} % \caption{Multilingual \protect\sTeX for Figure \protect\ref{fig:stex-monolingual}.} % \label{fig:stex-multiling} % \end{exfig} % % We retain the old |module| environment as an intermediate stage. It is still useful % for monolingual texts. Note that for files with a module, we still have to extract % |*.sms| files. It is not completely clear yet, how to adapt the workflows. We clearly % need a \lmh or editor command that transfers an old-style module into a new-style % signature/binding combo to prepare it for multilingual treatment. % \end{omgroup} % \end{omgroup} % % \begin{omgroup}[id=sec:user]{The User Interface} % The |smultiling| package accepts the \DescribeMacro{langfiles}|langfiles| option that % specifies -- for a module \meta{mod} that the module signature file has the name % \meta{mod}|.tex| and the language bindings of language with the ISO 639 language % specifier \meta{lang} have the file name % \meta{mod}|.|\meta{lang}|.tex|.\ednote{implement other schemes, e.g. the onefile % scheme.} % % \begin{omgroup}{Multilingual Modules} % There the \DescribeEnv{modsig}|modsig| environment works exactly like the old |module| % environment, only that the |id| attribute has moved into the required argument -- % anonymous module signatures do not make sense. % % The \DescribeEnv{modnl}|modnl| environment takes two arguments the first is the name % of the module signature it provides language bindings for and the second the ISO 639 % language specifier of the content language. We add the |primary| key |modnl|, which % can specify the primary language binding (the one the others translate from; and which % serves as the reference in case of translation conflicts).\ednote{@DG: This needs to % be implemented in LaTeXML} % % There is another difference in the multilingual encoding: All symbols are introduced % in the module signature, either by a |\symdef| or the new \DescribeMacro{\symi}|\symi| % macro. |\symi{|\meta{name}|}| takes a symbol name \meta{name} as an argument and % reserves that name. The variant \DescribeMacro{\symi*}|\symi*{|\meta{name}|}| declares % \meta{name} to be a primary symbol; see~\cite{Kohlhase:dmesmgm14} for a % discussion. \sTeX provides variants \DescribeMacro{\symii}|\symii| and % \DescribeMacro{\symiii}|\symiii| -- and their starred versions -- for multi-part % names. % \end{omgroup} % % \begin{omgroup}{Multilingual Definitions and Crossreferencing Terms} % We do not need a new infrastructure for defining mathematical concepts, only the % realization that symbols are language-independent. So we can use symbols for the % coordination of corresponding verbalizations. As the example in % Figure~\ref{fig:stex-multiling} already shows, we can just specify the symbol name in % the optional argument of the |\defi| macro to establish that the language bindings % provide different verbalizations of the same symbol. % % For multilingual term references the situtation is more complex: For single-word % verbalizations we could use |\atrefi| for language bindigns. Say we have introduced a % symbol |foo| in English by |\defi{foo}| and in German by |\defi[foo]{Foo}|. Then we % can indeed reference it via |\trefi{foo}| and |\atrefi{Foo}{foo}|. But one the one % hand this blurs the distinction between translation and ``linguistic variants'' and on % the other hand does not scale to multi-word compounds as |bar| in % Figure~\ref{fig:stex-multiling}, which we would have to reference as % |\atrefiii{gro"ses Feld Raster}{bar}|. To avoid this, the |smultiling| package % provides the new macros \DescribeMacro{\mtref*}|\mtrefi|, |\mtrefii|, and |\mtrefiii| % for multilingual references. Using this, we can reference |bar| as % |\mtrefiii[?bar]{gro"ses}{Feld}{Raster}|, where we use the (up to three) mandatory % arguments to segment the lexical constituents. % % The first argument it syntactially optional to keep the parallelity to |\*def*| % |\*tref*| it specifies the symbol via its name \meta{name} and module name \meta{mod} % in a MMT URI \meta{mod}|?|\meta{name}. Note that MMT URIs can be relative: % \begin{compactenum} % \item |foo?bar| denotes the symbol |bar| from module |foo| % \item |foo| the module |foo| (the symbol name is induced from the remaining % arguments of |\mtref*|) % \item |?bar| specifies symbol |bar| from the current module % \end{compactenum} % Note that the number suffix |i|/|ii|/|iii| indicates the number of words in the % actual language binding, not in the symbol name as in |\atref*|. % \end{omgroup} % % \begin{omgroup}{Multilingual Views} % Views receive a similar treatment as modules in the |smultiling| package. A % multilingual view consists of a view signature marked up with the % \DescribeMacro{viewsig}|viewsig| environment. This takes three required arguments: a % view name, the source module, and the target module. The optional first argument is % for metadata (|display|, |title|, |creators|, and |contributors|) and load information % (|frompath|, |fromrepos|, |topath|, and |torepos|).\ednote{MK: that does not work yet, % what we describe here is \texttt{mhviewig}; we need to refactor further.} % \begin{verbatim} % \begin{viewsig}[creators=miko,]{norm-metric}{metric-space}{norm} % \vassign{base-set}{base-set} % \vassign{metric}{\funcdot{x,y}{\norm{x-y}}} % \end{viewsig} % \end{verbatim} % Views have language bindings just as modules do, in our case, we have % \begin{verbatim} % \begin{gviewnl}[creators=miko]{norm-metric}{en}{norm}{metric-space} % \obligation{metric-space}{obl.norm-metric.en} % \begin{assertion}[type=obligation,id=obl.norm-metric.en] % $\defeq{d(x,y)}{\norm{x-y}}$ is a \trefii[metric-space]{distance}{function} % \end{assertion} % \begin{sproof}[for=obl.norm-metric.en] % {we prove the three conditions for a distance function:} % ... % \end{sproof} % \end{gviewnl} % \end{verbatim} % % \end{omgroup} % % \begin{omgroup}{Mathematical Keywords} % For translations of the mathemtical keywords, the |statements| and |sproofs| packages % in \sTeX define special language definition files, % e.g. |statements-ngerman.ldf|.\ednote{say more about this}\ednote{There is the % translator package which belongs to beamer, maybe we should switch to that.} There is % currently only very limited support for this. % \end{omgroup} % \end{omgroup} % % \begin{omgroup}{Limitations} % % We list the limitations of the |smultiling| package. % % \begin{omgroup}{General \texttt{babel} Integration} % There is currently no integration with the |babel| package that handles % language-specific aspects in {\LaTeX}. In particular, selecting the right language % must be done manually. In particular, the example from Figure~\ref{fic:stex-multiling} % would really have the form given in Figure~\ref{fig:stex-multiling-babel} -- see the % |\usepackage[usenglish,ngerman]{babel}| in line 2, and the |\selectlanguage| % statements in lines 6 and 13. % \begin{exfig} % \begin{verbatim} % \usepackage{multiling} % \usepackage[usenglish,ngerman]{babel}% babel support % \begin{modsig}{foo} % \symdef{bar}{BAR} % \symi{sar} % \end{modsig} % \selectlanguage{english}% english version follows % \begin{modnl}[creators=miko,primary]{foo}{en} % \begin{definition} % A \defiii[bar]{big}{array}{raster} ($\bar$) is a\ldots, it is much bigger % than a \defiii[sar]{small}{array}{raster}. % \end{definition} % \end{modnl} % \selectlanguage{german}% german umlauts please % \begin{modnl}[creators=miko]{foo}{de} % \begin{definition} % Ein \defiii[bar]{gro"ses}{Feld}{Raster} ($\bar$) ist ein\ldots, es % ist viel gr"o"ser als ein \defiii[sar]{kleines}{Feld}{Raster}. % \end{definition} % \end{modnl} % \end{verbatim}\vspace{-2em} % \caption{Multilingual \protect\sTeX with \texttt{babel}} % \label{fig:stex-multiling-babel} % \end{exfig} % % For the |langfiles| setup, which assumes that module signatures and langauge bindings % are in separate files, |babel| integration can be simplified by providing a % language-specific preamble file with |\usepackage{|\meta{language}|}{babel}| which is % pre-pended to all language binding files when formatted. This preamble can also contain % the other langauge-specific packages (e.g. for font encodings, etc.). % \end{omgroup} % % \begin{omgroup}{Language-Specific Limitations} % Some languages have more problems than others % \begin{description} % \item[Turkish] makes \texttt{=} an active character (to give better spacing); this % interacts unfavorably with the |keyval| package which needs \texttt{=} as key/value % separator (and gives it a different catcode). Therefore we need to prohibit this by % restricting the |shorthands| option: use |\usepackage[turkish,shorthands=:!]{babel}|. % \item[Chinese] needs special fonts and |xelatex|\ednote{get Jinbo to document this}. % \end{description} % \end{omgroup} % \end{omgroup} % % \StopEventually{\newpage\PrintIndex\newpage\PrintChanges\printbibliography}\newpage % % \begin{omgroup}[id=sec:impl:cls]{Implementation} % % \begin{omgroup}[id=sec:impl:cls:options]{Class Options} % \begin{macrocode} %<*sty> \newif\if@smultiling@mh@\@smultiling@mh@false \DeclareOption{mh}{\@smultiling@mh@true} \newif\if@langfiles\@langfilesfalse \DeclareOption{langfiles}{\@langfilestrue} \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{modules}} \ProcessOptions % \end{macrocode} % % We load the packages referenced here. % % \begin{macrocode} \if@smultiling@mh@\RequirePackage{smultiling-mh}\fi \RequirePackage{etoolbox} \RequirePackage{structview} % \end{macrocode} % \end{omgroup} % % \begin{omgroup}{Signatures} % % \begin{environment}{modsig} % The |modsig| environment is just a layer over the |module| environment. We also % redefine macros that may occur in module signatures so that they do not create markup. % \begin{macrocode} \newenvironment{modsig}[2][]{% \def\@test{#1}\ifx\@test\@empty\begin{module}[id=#2]\else\begin{module}[id=#2,#1]\fi\ignorespacesandpars} {\end{module}\ignorespacesandparsafterend} % \end{macrocode} % \end{environment} % % \begin{environment}{viewsig} % The |viewsig| environment is just a layer over the |view| environment with the keys % suitably adapted. % \begin{macrocode} \newenvironment{viewsig}[4][]{\def\@test{#1}\ifx\@test\@empty% \begin{view}[id=#2,ext=tex]{#3}{#4}\else\begin{view}[id=#2,#1,ext=tex]{#3}{#4}\fi% \ignorespacesandpars} {\end{view}\ignorespacesandparsafterend} % \end{macrocode} % \end{environment} % % \begin{macro}{\@sym*} % has a starred form for primary symbols. % \begin{macrocode} \newcommand\symi{\@ifstar\@symi@star\@symi} \newcommand\@symi[1]{\if@importing\else Symbol: \textsf{#1}\fi\ignorespacesandpars} \newcommand\@symi@star[1]{\if@importing\else Primary Symbol: \textsf{#1}\fi\ignorespacesandpars} \newcommand\symii{\@ifstar\@symii@star\@symii} \newcommand\@symii[2]{\if@importing\else Symbol: \textsf{#1-#2}\fi\ignorespacesandpars} \newcommand\@symii@star[2]{\if@importing\else Primary Symbol: \textsf{#1-#2}\fi\ignorespacesandpars} \newcommand\symiii{\@ifstar\@symiii@star\@symiii} \newcommand\@symiii[3]{\if@importing\else Symbol: \textsf{#1-#2-#3}\fi\ignorespacesandpars} \newcommand\@symiii@star[3]{\if@importing\else Primary Symbol: \textsf{#1-#2-#3}\fi\ignorespacesandpars} % \end{macrocode} % \end{macro} % \end{omgroup} % % \begin{omgroup}[id=sec:langbindings]{Language Bindings} % % \begin{macro}{modnl:*} % \begin{macrocode} \addmetakey{modnl}{load} \addmetakey*{modnl}{title} \addmetakey*{modnl}{creators} \addmetakey*{modnl}{contributors} \addmetakey{modnl}{srccite} \addmetakey{modnl}{primary}[yes] % \end{macrocode} % \end{macro} % % \begin{environment}{modnl} % The |modnl| environment is just a layer over the |module| environment and the % |\importmodule| macro with the keys and language suitably adapted. % \begin{macrocode} \newenvironment{modnl}[3][]{\metasetkeys{modnl}{#1}% \def\@test{#1}\ifx\@test\@empty\begin{module}[id=#2.#3]\else\begin{module}[id=#2.#3,#1]\fi% \if@langfiles\importmodule[load=#2,ext=tex]{#2}\else \ifx\modnl@load\@empty\importmodule{#2}\else\importmodule[ext=tex,load=\modnl@load]{#2}\fi% \fi% \ignorespacesandpars} {\end{module}\ignorespacesandparsafterend} % \end{macrocode} % \end{environment} % % \begin{environment}{viewnl} % The |viewnl| environment is just a layer over the |viewsketch| environment with the % keys and langauge suitably adapted.\ednote{MK: we have to do something about the % if@langfiles situation here. But this is non-trivial, since we do not know the current % path, to which we could append .\meta{lang}!} % \begin{macrocode} \newenvironment{viewnl}[5][]{\def\@test{#1}\ifx\@test\@empty% \begin{viewsketch}[id=#2.#3,ext=tex]{#4}{#5}\else% \begin{viewsketch}[id=#2.#3,#1,ext=tex]{#4}{#5}\fi% \ignorespacesandpars} {\end{viewsketch}\ignorespacesandparsafterend} % \end{macrocode} % \end{environment} % \end{omgroup} % % \begin{omgroup}{Multilingual Statements and Terms} % % \begin{macro}{\mtref*} % we first first define an auxiliary conditional |\@instring| that checks of |?| is in % the first argument. |\mtrefi| uses it, if there is one, it just calls |\termref|, % otherwise it calls |\@mtrefi|, which assembles the |\termref| after splitting at the % |?|. % \begin{macrocode} \def\@instring#1#2{TT\fi\begingroup\edef\x{\endgroup\noexpand\in@{#1}{#2}}\x\ifin@} \newcommand\mtrefi[2][]{\if\@instring{?}{#1}\@mtref #1\relax{#2}\else\termref[cd=#1]{#2}\fi} \def\@mtref#1?#2\relax{\termref[cd=#1,name=#2]} \newcommand\mtrefis[2][]{\mtrefi[#1]{#2s}} \newcommand\mtrefii[3][]{\mtrefi[#1]{#2 #3}} \newcommand\mtrefiis[3][]{\mtrefi[#1]{#2 #3s}} \newcommand\mtrefiii[4][]{\mtrefi[#1]{#2 #3 #4}} \newcommand\mtrefiiis[4][]{\mtrefi[#1]{#2 #3 #4s}} % \end{macrocode} % \end{macro} % \end{omgroup} % % \begin{omgroup}{Miscellaneneous} % the |\ttl| macro (to-translate) is used to mark untranslated stuff. We need a better % \latexml treatment of this eventually that is integrated with MathHub.info. % \begin{macro}{\ttl} % \begin{macrocode} \newcommand\ttl[1]{\red{TTL: #1}} % % \end{macrocode} % \end{macro} % \end{omgroup} % \end{omgroup} % \Finale % \endinput % \iffalse %%% Local Variables: %%% mode: doctex %%% TeX-master: t %%% End: % \fi % LocalWords: iffalse cls omdoc latexml texttt smlog.cls sref % LocalWords: maketitle newpage tableofcontents newpage omgroup ednote ltxml % LocalWords: printbibliography showmeta metakeys amstext ginput newcommand % LocalWords: module-defs gimport renewcommand langbindings gle newenvironment % LocalWords: doctex