summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/stex/doc/stex-manual.tex
blob: 31b9c4eaeb258b665e187f554448d5c3d46a2dca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
\makeatletter
\ifcsname if@infulldoc\endcsname\else
    \expandafter\newif\csname if@infulldoc\endcsname\@infulldocfalse
\fi
\makeatother

\csname if@infulldoc\endcsname\else

\def\bibfolder#1{../lib/bib/#1}

\input{stex-docheader}

\infulldoctrue

\begin{document}
  \csname if@infulldoc\endcsname\else
	\title{
		The {\stex{3}} Manual
		\thanks{Version {\fileversion} (last revised {\filedate})}
 	}
	\author{Michael Kohlhase, Dennis Müller\\
		FAU Erlangen-Nürnberg\\
		\url{http://kwarc.info/}
	}
	\pagenumbering{roman}
	\maketitle
	
	\input{stex-abstract}\bigskip

  This is the user manual for the \sTeX package and 
  associated software. It is primarily directed at end-users 
  who want to use \sTeX to author semantically
  enriched documents. For the full documentation, see
  \href{\basedocurl/stex-doc.pdf}{the \sTeX documentation}.
	
	\makeatletter
		\renewcommand\part{%
    		\clearpage
  			\thispagestyle{plain}%
  			\@tempswafalse
  			\null\vfil
  			\secdef\@part\@spart%
  		}
		\newcounter{chapter}
		\numberwithin{section}{chapter}
		\renewcommand\thechapter{\@arabic\c@chapter}
		\renewcommand\thesection{\thechapter.\@arabic\c@section}
		\newcommand*\chaptermark[1]{}
		\setcounter{secnumdepth}{2}
		\newcommand\@chapapp{\chaptername}
		%\newcommand\chaptername{Chapter}
  		\def\ps@headings{%
    		\let\@oddfoot\@empty
    		\def\@oddhead{{\slshape\rightmark}\hfil\thepage}%
    		\let\@mkboth\markboth
    		\def\chaptermark##1{%
      			\markright{\MakeUppercase{%
        			\ifnum \c@secnumdepth >\m@ne
            			\@chapapp\ \thechapter. \ %
        			\fi
        		##1}}%
        	}%
        }
		\newcommand\chapter{\clearpage
			\thispagestyle{plain}%
			\global\@topnum\z@
			\@afterindentfalse
			\secdef\@chapter\@schapter%
		}
		\def\@chapter[#1]#2{\refstepcounter{chapter}%
			\typeout{\@chapapp\space\thechapter.}%
			\addcontentsline{toc}{chapter}%
				{\protect\numberline{\thechapter}#1}%
			\chaptermark{#1}%
			\addtocontents{lof}{\protect\addvspace{10\p@}}%
			\addtocontents{lot}{\protect\addvspace{10\p@}}%
			\@makechapterhead{#2}%
			\@afterheading%
		}
		\def\@makechapterhead#1{%
			\vspace*{50\p@}%
			{\parindent \z@ \raggedright \normalfont
				\huge\bfseries \@chapapp\space \thechapter
				\par\nobreak
				\vskip 20\p@
				\interlinepenalty\@M
				\Huge \bfseries #1\par\nobreak
				\vskip 40\p@
			}%
		}
\newcommand*\l@chapter[2]{%
  \ifnum \c@tocdepth >\m@ne
    \addpenalty{-\@highpenalty}%
    \vskip 1.0em \@plus\p@
    \setlength\@tempdima{1.5em}%
    \begingroup
      \parindent \z@ \rightskip \@pnumwidth
      \parfillskip -\@pnumwidth
      \leavevmode \bfseries
      \advance\leftskip\@tempdima
      \hskip -\leftskip
      #1\nobreak\hfil
      \nobreak\hb@xt@\@pnumwidth{\hss #2%
                                 \kern-\p@\kern\p@}\par
      \penalty\@highpenalty
    \endgroup
  \fi}
\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.8em}}
\renewcommand*\l@subsection{\@dottedtocline{2}{3.8em}{3.2em}}
\renewcommand*\l@subsubsection{\@dottedtocline{3}{7.0em}{4.1em}}
\def\partname{Part}
\def\toclevel@part{-1}
\def\maketitle{\chapter{\@title}}
\let\thanks\@gobble
\let\DelayPrintIndex\PrintIndex
\let\PrintIndex\@empty
\providecommand*{\hexnum}[1]{\text{\texttt{\char`\"}#1}}
\makeatother

\ExplSyntaxOn
\int_set:Nn \l_document_structure_section_level_int {1}
\ExplSyntaxOff

\clearpage

{%
  \def\\{:}% fix "newlines" in the ToC
  \tableofcontents
}

\clearpage
\pagenumbering{arabic}
	
\fi

\long\def\ignore#1{}

\begin{dangerbox}
  Boxes like this one contain implementation details that are
  mostly relevant for more advanced use cases, might be useful 
  to know when debugging, or might be good to know to better understand
  how something works. They can easily be skipped on a first read.
\end{dangerbox}

\begin{mmtbox}
  Boxes like this one explain how some \sTeX concept relates to the \mmt/\omdoc system,
  philosophy or language; see \cite{uniformal:on,Kohlhase:OMDoc1.2} for introductions.
\end{mmtbox}


\begin{sfragment}{What is \sTeX?}
  
Formal systems for mathematics (such as interactive theorem provers)
have the potential to significantly increase both the accessibility
of published knowledge, as well as the confidence in its veracity,
by rendering the precise semantics of statements machine actionable.
This allows for a plurality of added-value services, from semantic
search up to verification and automated theorem proving.
Unfortunately, their usefulness is hidden behind severe barriers
to accessibility; primarily related to their surface languages
reminiscent of programming languages and very unlike informal
standards of presentation.

\sTeX minimizes this gap between informal and formal 
mathematics by integrating formal methods into established
and widespread authoring workflows, primarily \LaTeX, via 
non-intrusive semantic
annotations of arbitrary informal document fragments. That way
formal knowledge management services become available for informal
documents, accessible via an IDE for authors and via generated
\emph{active} documents for readers, while remaining fully compatible
with existing authoring workflows and publishing systems.

Additionally, an extensible library of reusable
document fragments is being developed, that serve as reference targets
for global disambiguation, intermediaries for content exchange
between systems and other services.

Every component of the system is designed modularly and extensibly,
and thus lay the groundwork for a potential full integration of
interactive theorem proving systems into established informal document
authoring workflows.

\paragraph{} The general \sTeX workflow combines functionalities
provided by several pieces of software:
\begin{itemize}
\item The \sTeX package collection to use semantic annotations in {\LaTeX} documents,
\item \RusTeX \cite{RusTeX:on} to convert |tex| sources to (semantically enriched) |xhtml|,
\item The \mmt system~\cite{uniformal:on}, that extracts semantic information from the
  thus generated |xhtml| and provides semantically informed added value services.
  Notably, \mmt integrates the \RusTeX system already.
\end{itemize}

\end{sfragment}

\begin{sfragment}{Quickstart}
  
  \begin{sfragment}{Setup}
      There are two ways of using \sTeX: as a 
      \begin{enumerate}
      \item way of writing {\LaTeX} more modularly (object-oriented Math) for creating PDF
        documents or
      \item foundation for authoring active documents in HTML5 instrumented with knowledge
        management services. 
      \end{enumerate}
      Both are legitimate and useful. The first requires a significantly smaller
      tool-chain, so we describe it first. The second requires a much more substantial
      (and experimental) toolchain of knowledge management systems. Both workflows profit
      from an integrated development environment (IDE), which (also) automates setup as
      far as possible (see \sref{sec.sTeX-IDE}). 

      \begin{sfragment}[id=sec.minimal-setup]{Minimal Setup for the PDF-only Workflow}
        In the best of all worlds, there is no setup, as you already have a new version of
        {\TeX}Live on your system as a {\LaTeX} enthusiast. If not now is the time to
        install it; see \cite{TeXLive:on}. You can usually update {\TeX}Live via a package
        manager or the {\TeX}Live manager \textbf{tlmgr}.

        Alternatively, you can install \sTeX from CTAN, the Comprehensive {\TeX} Archive
        Network; see \cite{stexCTAN:on} for details.
      \end{sfragment}

      \begin{sfragment}[id=sec.git-setup]{GIT-based Setup for the \sTeX Development Version}
        If you want use the latest and greatest \sTeX packages
        that have not even been released to CTAN, 
        then you can directly clone them from the \sTeX development
        repository \cite{sTeX:github:on} by the following command-line instructions: 
\begin{lstlisting}[language=bash]
  cd <stexdir>
  git clone https://github.com/slatex/sTeX.git
\end{lstlisting}
       and keep it updated by pulling updates via \lstinline|git pull| in the cloned \sTeX
       directory.
       Then update your \lstinline|TEXINPUTS| environment variable, e.g. by placing the following line in your \lstinline|.bashrc|:
\begin{lstlisting}[language=bash]
export TEXINPUTS="$(TEXINPUTS):<sTeXDIR>//:"
\end{lstlisting}       
      \end{sfragment}

      \begin{sfragment}[id=sec.stex-archives]{\sTeX Archives (Manual Setup)}
        Writing semantically annotated \sTeX becomes much easier, if we can use
        well-designed libraries of already annotated content. \sTeX provides such
        libraries as \sTeX archives -- i.e. GIT repositories at
        \url{https://gl.mathhub.info} -- most prominently the SMGLoM libraries at
        \url{https://gl.mathhub.info/smglom}.

        To do so, we set up a \textbf{local MathHub} by creating a MathHub directory
        \lstinline|<mhdir>|. Every \sTeX archive as an \textbf{archive path}
        \lstinline|<apath>| and a name \lstinline|<archive>|. We can clone the \sTeX
        archive by the following command-line instructions: 
\begin{lstlisting}[language=bash]
  cd <mhdir>/<apath>
  git clone https://gl.mathhub.info/smglom/<archive>.git
\end{lstlisting}
        Note that \sTeX archives often depend on other archives, thus you should be
        prepared to clone these as well -- e.g. if \texttt{pdflatex} reports missing
        files.  
        To make sure that \sTeX too knows where to find its archives, we need to set a global
        system variable |MATHHUB|, that points to your local |MathHub|-directory (see
        \sref{sec.stexarchives}).
\begin{lstlisting}[language=bash]
export MATHHUB="<mhdir>''
\end{lstlisting}
      \end{sfragment}
      
      \begin{sfragment}[id=sec.sTeX-IDE]{The \sTeX IDE}
        We are currently working on an \sTeX IDE as an \sTeX plugin for |VScode|;
        see~\cite{sTeX-IDE:on}. It will feature a setup procedure that automates the setup
        described above (and below). For additional functionality see the (now obsolete)
        plugin for \sTeX1 \cite{stexls:on,stexls-vscode-plugin:on}.
      \end{sfragment}
    
  \begin{sfragment}{Manual Setup for Active Documents and Knowledge Management Services}
      Foregoing on the \sTeX IDE, we will need several additional (on top of the minimal
      setup above) pieces of software; namely:
      \begin{itemize}
        \item \textbf{The \mmt System} available
          \href{https://github.com/uniformal/MMT/tree/sTeX}{here}. 
          We recommend following
          the setup routine documented 
          \href{https://uniformal.github.io//doc/setup/}{here}.

          Following the setup routine (Step 3) will entail designating
          a |MathHub|-directory on your local file system, where
          the \mmt system will look for \sTeX/\mmt content archives.

        \item \textbf{\sTeX Archives} If we only care about {\LaTeX} and generating
          |pdf|s, we do not technically need \mmt at all; however, we still need the
          |MATHHUB| system variable to be set. Furthermore, \mmt can make downloading
          content archives we might want to use significantly easier, since it makes sure
          that all dependencies of (often highly interrelated) \sTeX archives are cloned
          as well.

          Once set up, we can run |mmt| in a shell and download an archive along with all
          of its dependencies like this: |lmh install <name-of-repository>|, or a whole
          \emph{group} of archives; for example, |lmh install smglom| will download all
          smglom archives.
        \item \textbf{\RusTeX} The \mmt system will also set up \RusTeX for you, which is
          used to generate (semantically annotated) |xhtml| from tex sources. In lieu of
          using \mmt, you can also download and use \RusTeX directly
          \href{https://github.com/slatex/RusTeX}{here}.
      \end{itemize}
    \end{sfragment}
  \end{sfragment}

  \input{stex-tutorial}

\end{sfragment}

\begin{sfragment}{Creating \sTeX Content}

  \input{packages/stex-basics}

  \begin{sfragment}{How Knowledge is Organized in \sTeX}

    \sTeX content is organized on multiple levels:
    \begin{enumerate}
      \item \sTeX \textbf{archives} (see \sref{sec.stexarchives})
        contain individual |.tex|-files.
      \item These may contain \sTeX \textbf{modules}, introduced via 
      \stexcode"\begin{smodule}{ModuleName}".\iffalse\end{smodule}\fi
      \item Modules contain \sTeX \textbf{symbol declarations}, introduced via
        \stexcode"\symdecl{symbolname}", \stexcode"\symdef{symbolname}" and some other
        constructions. Most symbols have a \emph{notation} that can
        be used via a \emph{semantic macro} \stexcode"\symbolname" generated
        by symbol declarations.
      \item \sTeX \textbf{expressions} finally are built up from
        usages of semantic macros.
    \end{enumerate}

    \begin{mmtbox}
      \begin{itemize}
      \item \sTeX archives are simultaneously \mmt archives, and the same directory
        structure is consequently used.
      \item \sTeX modules correspond to \omdoc/\mmt \emph{theories}.
        \stexcode"\importmodule"s (and similar constructions) induce \mmt |include|s and
        other \emph{theory morphisms}, thus giving rise to a \emph{theory graph} in the
        \omdoc sense~\cite{RabKoh:WSMSML13}.
      \item Symbol declarations induce \omdoc/\mmt \emph{constants}, with optional
        (formal) \emph{type} and \emph{definiens} components.
      \item Finally, \sTeX expressions are converted to \omdoc/\mmt terms, which use the
        abstract syntax (and XML encoding) of \openmath \cite{BusCapCar:2oms04}.
      \end{itemize}
    \end{mmtbox}
  \end{sfragment}

  \begin{sfragment}[id=sec.stexarchives]{\sTeX Archives}
    \input{packages/stex-mathhub}
  \end{sfragment}

  \begin{sfragment}[id=sec.decls]{Module, Symbol and Notation Declarations}
    \input{packages/stex-modules}
    \input{packages/stex-symbols}
  \end{sfragment}

  \begin{sfragment}{Module Inheritance and Structures}
    The \sTeX features for modular document management are inherited from the OMDoc/MMT
    model that organizes knowledge into a graph, where the nodes are theories (called
    modules in \sTeX) and the edges are truth-preserving mappings (called theory
    morphismes in MMT). We have already seen modules/theories above.

    Before we get into theory morphisms in \sTeX we will see a very simple application of
    modules: managing multilinguality modularly.

    \begin{sfragment}{Multilinguality and Translations}

      If we load the \sTeX document class or package with the option |lang=<lang>|, \sTeX
      will load the appropriate \pkg{babel} language for you -- e.g. |lang=de| will load
      the babel language |ngerman|. Additionally, it makes \sTeX aware of the current
      document being set in (in this example) \emph{german}. This matters for reasons
      other than mere \pkg{babel}-purposes, though:

      Every \emph{module} is assigned a language. If no \sTeX
      package option is set that allows for inferring a language,
      \sTeX will check whether the current file name ends in
      e.g. |.en.tex| (or |.de.tex| or |.fr.tex|, or...) and
      set the language accordingly. Alternatively, a language
      can be explicitly assigned via 
      \stexcode"\begin{smodule}[lang=<language>]{Foo}".
      \iffalse\end{smodule}\fi

      \begin{mmtbox}
        Technically, each |smodule|-environment induces \emph{two}
        \omdoc/\mmt theories:
        \stexcode"\begin{smodule}[lang=<lang>]{Foo}"
        \iffalse\end{smodule}\fi
        generates a theory |some/namespace?Foo| that only contains
        the ``formal'' part of the module -- i.e. exactly the
        content that is exported when using \stexcode"\importmodule".

        Additionally, \mmt generates a \emph{language theory} 
        |some/namespace/Foo?<lang>| that includes |some/namespace?Foo|
        and contains all the other document content -- variable
        declarations, includes for each \stexcode"\usemodule", etc.
      \end{mmtbox}

      Notably, the language suffix in a filename is ignored
      for \stexcode"\usemodule", \stexcode"\importmodule"
      and in generating/computing URIs for modules. This however
      allows for providing \emph{translations} for modules
      between languages without needing to duplicate content:

      If a module |Foo| exists in e.g. english in a file |Foo.en.tex|,
      we can provide a file |Foo.de.tex| right next to it, and write
      \stexcode"\begin{smodule}[sig=en]{Foo}".
      \iffalse\end{smodule}\fi
      The |sig|-key then signifies, that the ``signature'' of the
      module is contained in the \emph{english} version of the module,
      which is immediately imported from there, just like
      \stexcode"\importmodule" would.

      Additionally to translating the informal content of a module
      file to different languages, it also allows for customizing
      notations between languages. For example,
      the \emph{least common multiple} of two numbers is often
      denoted as $\mathtt{lcm}(a,b)$ in english, but is
      called \emph{kleinstes gemeinsames Vielfaches} in german
      and consequently denoted as $\mathtt{kgV}(a,b)$ there.

      We can therefore imagine a german version of an lcm-module
      looking something like this:

      \begin{latexcode}[gobble=8]
        \begin{smodule}[sig=en]{lcm}
          \notation*{lcm}[de]{\comp{\mathtt{kgV}}(#1,#2)}

          Das \symref{lcm}{kleinste gemeinsame Vielfache}
          $\lcm{a,b}$ von zwei Zahlen $a,b$ ist... 
        \end{smodule}
      \end{latexcode}

      If we now do \stexcode"\importmodule{lcm}"
      (or \stexcode"\usemodule{lcm}") within a \emph{german} document,
      it will also load the content of the german translation,
      including the |de|-notation for \stexcode"\lcm".

    \end{sfragment}

    \input{packages/stex-inheritance}
    \input{packages/stex-features}
  \end{sfragment}

  \begin{sfragment}{Primitive Symbols (The \sTeX Metatheory)}
    \input{packages/stex-metatheory}
  \end{sfragment}
  
\end{sfragment}

\begin{sfragment}[id=sec.textsymbols]{Using \sTeX Symbols}
  \input{packages/stex-terms}
  \input{packages/stex-references}
\end{sfragment}

\begin{sfragment}{\sTeX Statements}
  \input{packages/stex-statements}
  \input{packages/stex-proofs}
\end{sfragment}

\begin{sfragment}[id=sec.customhighlight]{Highlighting and Presentation Customizations}

  The environments starting with |s| (i.e. \stexcode"smodule", \stexcode"sassertion",
  \stexcode"sexample", \stexcode"sdefinition", \stexcode"sparagraph" and
  \stexcode"sproof") by default produce no additional output whatsoever (except for the
  environment content of course). Instead, the document that uses them (whether directly
  or e.g. via \stexcode"\inputref") can decide how these environments are supposed to look
  like.

  The \pkg{stexthm} package defines some default customizations that can be used, but of
  course many existing \LaTeX\xspace templates come with their own |definition|, |theorem|
  and similar environments that authors are supposed (or even required) to use. Their
  concrete syntax however is usually not compatible with all the additional arguments that
  \sTeX allows for semantic information.

  Therefore we introduced the separate environments \stexcode"sdefinition" etc. instead of
  using \stexcode"definition" directly. We allow authors to specify how these environments
  should be styled via the commands \stexcode"stexpatch*".

  \begin{function}{\stexpatchmodule,\stexpatchdefinition,
      \stexpatchassertion,\stexpatchexample,\stexpatchparagraph,
      \stexpatchproof}
    All of these commands take one optional and two proper arguments, i.e.\\
    \stexcode"\stexpatch*[<type>]{<begin-code>}{<end-code>}".

    After \stex reads and processes the optional arguments for these environments, (some
    of) their values are stored in the macros \stexcode"\s*<field>"
    (i.e. \stexcode"sexampleid", \stexcode"\sassertionname", etc.). It then checks for all
    the values |<type>| in the |type=|-list, whether an \stexcode"\stexpatch*[<type>]" for
    the current environment has been called. If it finds one, it uses the patches
    |<begin-code>| and |<end-code>| to mark up the current environment. If no patch for
    (any of) the type(s) is found, it checks whether and \stexcode"\stexpatch*" was called
    without optional argument.
  \end{function}

  For example, if we want to use a predefined |theorem| environment for
  \stexcode"sassertion"s with |type=theorem|, we can do
\begin{latexcode}
\stexpatchassertion[theorem]{\begin{theorem}}{\end{theorem}}
\end{latexcode}
  ...or, rather, since e.g. |theorem|-like environments defined using \pkg{amsthm} take an
  optional title as argument, we can do:
\begin{latexcode}
\stexpatchassertion[theorem]
  {\ifx\sassertiontitle\@empty
       \begin{theorem}
   \else
       \begin{theorem}[\sassertiontitle]
   \fi}
 {\end{theorem}}    
\end{latexcode}

  Or, if we want \emph{all kinds of} \stexcode"sdefinition"s to use a predefined
  |definition|-environment irrespective of their |type=|, then we can issue the following
  customization patch: 
\begin{latexcode}
\stexpatchdefinition
  {\ifx\sdefinitiontitle\@empty
      \begin{definition}
    \else
      \begin{definition}[\sdefinitiontitle]
  \fi}
  {\end{definition}}
\end{latexcode}

  \begin{function}{\compemph,\varemph,\symrefemph,\defemph}
    Apart from the environments, we can control how \sTeX highlights variables, notation
    components, \stexcode"\symref"s and \stexcode"\definiendum"s, respectively.

    To do so, we simply redefine these four macros. For example, to highlight notation
    components (i.e. everything in a \stexcode"\comp") in blue, as in this document, we
    can do \stexcode"\def\compemph#1{\textcolor{blue}{#1}}".  By default, |\compemph| et
    al do nothing.
  \end{function}

  \begin{function}{\compemph@uri,\varemph@uri,\symrefemph@uri,\defemph@uri}
    For each of the four macros, there exists an additional macro that takes the full URI
    of the relevant symbol currently being highlighted as a second argument. That allows
    us to e.g. use pdf tooltips and links. For example, this document uses\Ednote{MK: why
      |protected|, ... if we show that, then we should explain.}
\begin{latexcode}
\protected\def\symrefemph@uri#1#2{
  \pdftooltip{
    \srefsymuri{#2}{\symrefemph{#1}}
  }{
    URI:~\detokenize{#2}
  }
}
\end{latexcode}
  By default, |\compemph@uri| is simply defined as |\compemph{#1}| (analogously for the
  other three commands).
\end{function}
\end{sfragment}

\begin{sfragment}{Additional Packages}
  \begin{sfragment}{Tikzinput: Treating TIKZ code as images}
    \input{packages/stex-tikzinput}
  \end{sfragment}
  \begin{sfragment}{Modular Document Structuring}
    \input{packages/stex-document-structure}
  \end{sfragment}
  \begin{sfragment}{Slides and Course Notes}
    \input{packages/stex-slides}
  \end{sfragment}
  \begin{sfragment}{Representing Problems and Solutions}
    \input{packages/stex-problem}
  \end{sfragment}
  \begin{sfragment}{Homeworks, Quizzes and Exams}
  \input{packages/stex-hwexam}
  \end{sfragment}
\end{sfragment}

\csname if@infulldoc\endcsname\else
\newpage 
\printbibliography
\end{document}
\fi

%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End:

%  LocalWords:  stex-docheader infulldoctrue l@subsubsection toclevel@part ExplSyntaxOff
%  LocalWords:  l_document_structure_section_level_int dangerbox mmtbox omdoc OBJref lmh
%  LocalWords:  own:fifom MueRabRot:rslffml20 sec.stexarchives stex-mathhub ngerman a,b
%  LocalWords:  Metatheory sec.customhighlight sproof stexthm xspace stexpatchmodule
%  LocalWords:  stexpatchexample stexpatchparagraph sexampleid amsthm sassertiontitle
%  LocalWords:  sdefinitiontitle compemph varemph srefsymuri stex-hwexam TeXLive:on tlmgr
%  LocalWords:  stexls:on,stexls-vscode-plugin:on