diff options
-rw-r--r-- | Master/texmf-dist/doc/latex/concepts/README | 60 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/concepts/concepts.pdf | bin | 0 -> 306995 bytes | |||
-rw-r--r-- | Master/texmf-dist/source/latex/concepts/concepts.dtx | 434 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/concepts/concepts.sty | 568 | ||||
-rwxr-xr-x | Master/tlpkg/bin/tlpkg-ctan-check | 2 | ||||
-rw-r--r-- | Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc | 1 | ||||
-rw-r--r-- | Master/tlpkg/tlpsrc/concepts.tlpsrc | 0 |
7 files changed, 1064 insertions, 1 deletions
diff --git a/Master/texmf-dist/doc/latex/concepts/README b/Master/texmf-dist/doc/latex/concepts/README new file mode 100644 index 00000000000..bdafc91e1ee --- /dev/null +++ b/Master/texmf-dist/doc/latex/concepts/README @@ -0,0 +1,60 @@ +LaTeX Package : concepts v0.0.4 + +Last Modified : 2012-12-08 + +Author : Michiel Helvensteijn (www.mhelvens.net) + +This package helps to keep track of formal `concepts' for a +specific field or document. This is particularly useful for +scientific papers in e.g. physics, mathematics or computer +science. Such papers often introduce several concepts accompanied +by symbols that can represent instances of them. This package +allows you to declare such concepts once, near their first +introduction in the document, and ensures consistent use of their +symbols and names. + +In the near future, this package will integrate with the +glossaries package to provide more functionality and a consistent +experience when using both packages. + +===== Prerequisites ===== + +To use this package, you need at least the following packages +installed: + +* etextools +* nth +* xspace +* xparse +* ltxkeys (2012/11/17) +* xstring + +Most of these will simply exist in your LaTeX distribution. +But it's possible you may not have the right version of ltxkeys +installed, since it recently changed its interface for handling +list-values. You can find the latest version on CTAN. + +In the near future, this package will drop several dependencies. + +===== Installation ===== + +concepts.sty is provided directly in the package archive. Put +it in a place where your LaTeX distribution can find it. + +(concepts.sty is not generated, but manually maintained; you + may use docstrip to remove the documentation, but you don't + have to; it will just work the way it is) + +===== Documentation ===== + +concepts.pdf is provided directly in the package archive. To +generate the documentation yourself, run LaTeX on concepts.dtx. + +(concepts.dtx does not contain the package code itself; it inputs + concepts.sty directly to document the implementation) + +===== License ===== + +This material is subject to the LaTeX Project Public License. See +http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html +for the details of that license. diff --git a/Master/texmf-dist/doc/latex/concepts/concepts.pdf b/Master/texmf-dist/doc/latex/concepts/concepts.pdf Binary files differnew file mode 100644 index 00000000000..156dc16cbf2 --- /dev/null +++ b/Master/texmf-dist/doc/latex/concepts/concepts.pdf diff --git a/Master/texmf-dist/source/latex/concepts/concepts.dtx b/Master/texmf-dist/source/latex/concepts/concepts.dtx new file mode 100644 index 00000000000..2fd174bb89a --- /dev/null +++ b/Master/texmf-dist/source/latex/concepts/concepts.dtx @@ -0,0 +1,434 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% % +% Copyright (C) 2012 by Michiel Helvensteijn - www.mhelvens.net % +% % +% http://latex-concepts.googlecode.com % +% % +% 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 `author-maintained'. % +% % +% The Current Maintainer of this work is Michiel Helvensteijn. % +% % +% This work consists of the files concepts.dtx and concepts.sty. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%% 'ltxdoc' to typeset the documentation +% +\documentclass[a4paper]{ltxdoc} + +%%% including the 'concepts' package itself +% +\usepackage{concepts}[2012/11/25] + +%%% including other packages we need +% +\usepackage{etextools} +\usepackage{etoolbox} +\usepackage{framed} +\usepackage{color} +\usepackage{marginnote} +\usepackage{listings} %1 syntax highlighting +\usepackage{lstautogobble} %2 ignore common indentation + +%%% skip any indentation directly after a code block or macro signature +% +\makeatletter + \newcommand*{\@noindentnext}{\everypar{{\setbox\z@\lastbox}\everypar{}}} + \AfterEndEnvironment{codeframe}{\@noindentnext} + \AfterEndEnvironment{uninterestingcodeframe}{\@noindentnext} + \apptocmd{\marg}{\@noindentnext}{}{} + \apptocmd{\oarg}{\@noindentnext}{}{} + \apptocmd{\parg}{\@noindentnext}{}{} + \pretocmd{\DescribeMacro}{\noindent\\}{}{} +\makeatother + +%%% documentation options +% +\EnableCrossrefs +\CodelineIndex +\RecordChanges + +%%% title and author information +% +\GetFileInfo{concepts.sty} +\title{The \textsf{concepts} package\thanks{% + This document corresponds to \textsf{concepts}~\fileversion, dated \filedate.% + Development of this package is organized at \texttt{http://latex-concepts.googlecode.com}.% + I am happy to receive feedback there.% +}} +\author{Michiel Helvensteijn \\ \texttt{mhelvens+latex@gmail.com}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Changes % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\changes{0.0.1}{2012/11/16}{initial version} +\changes{0.0.2}{2012/11/25}{put the package into a .dtx file} +\changes{0.0.3}{2012/12/01}{separated the .dtx file from the .sty file} +\changes{0.0.4}{2012/12/08}{finished the documentation and made a few fixes} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\begin{document} % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\maketitle + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Introduction and Motivation} % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Documents with a lot of formal notation (such as papers about mathematics or +theoretical computer science) can introduce a number of concepts that need +to be managed. They'll have \emph{names}, \emph{descriptions} and associated +\emph{symbols} that need to be typeset, as well as \emph{relations} between them. + +I'm now writing my PhD thesis in the field of Theoretical Computer Science. +It will be especially heavy with definitions. I need to make sure that every +symbol is associated with no more than one concept and that all names and +symbols are consistently used. I'll also need to generate a glossary with +this information. But I don't want to manually keeping track +of all that. It's error-prone and it takes time. I'd rather focus on the theory. + +There are already techniques and packages that help lighten the load: +\begin{itemize} + \item Rather than use any names or symbols directly in the text, declare + a macro for each one. If you ever need to change one, you'll only + have to do it in one place. You'll also be far less likely to + introduce any typos. + \item There are packages out there to keep track of and output a glossary% + \footnote{It is sometimes called a nomenclature. + The distinction is subtle.}. +\end{itemize} +But I'm not aware of any technique or package to ensure I'm not +using a name or symbol inconsistently, thereby potentially +confusing the reader. And even if there was, this is all still a lot of +overhead. + +I wrote the |concepts| package to automate all this stuff for me. Every +time I introduce a new concept in my thesis I `declare' it once. The package +then defines all necessary macros for me and checks that I'm using them +properly. + +In \textsf{concepts}~\fileversion{}, most of the above already works but it +cannot generate a glossary yet. In future versions, it will interface with +the \textsf{glossaries} package to accomplish this. + +I'm also planning to implement a rudimentary typesystem, to catch even more +kinds of mistakes in symbol usage. There will also be additional ways of +typesetting concept-related stuff, such as useful sentence fragments. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Usage Prep % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%%% formatting the code blocks +% +\setlength{\FrameSep}{0pt} +\setlength{\MacroIndent}{16pt} +\setlength{\MacrocodeTopsep}{2pt} + +%%% switching between relevant and uninteresting code block coloring +% +\makeatletter + \definecolor{uninterestingcodecolor}{rgb}{.4,.4,.4} + \let\old@macro@font\macro@font + + \newenvironment{codeframe}{% + \definecolor{shadecolor}{rgb}{.9,.9,.9}% + \begin{shaded}% + }{% + \end{shaded}% + } + + \newenvironment{uninterestingcodeframe}{% + \vspace{-5mm}% + \definecolor{shadecolor}{rgb}{.97,.97,.97}% + \begin{shaded}% + \def\macro@font{\color{uninterestingcodecolor}\old@macro@font}% + }{% + \end{shaded}% + } +\makeatother + +%%% meta-optional arguments (that means: without explicit []) +% +\makeatletter + \newcommand*{\movarg}[1]{[ \verb|#1| ]\@noindentnext} + \newcommand*{\momarg}[1]{[ \meta{#1} ]\@noindentnext} +\makeatother + +%%% code blocks for examples +% +\lstdefinelanguage{latex}{ + language=[LaTeX]tex, + moretexcs={detokenize, + NewConcept,ConceptOption,ConceptName,ConceptSymbol, + delta,product,p,d,prd}, + texcsstyle=*\bfseries +} + +\lstnewenvironment{latexcode}{% + \renewcommand{\ttdefault}{pcr}% + \lstset{language=latex,basicstyle=\ttfamily\small,autogobble=true}% +}{} + +\BeforeBeginEnvironment{latexcode}{\noindent\begin{codeframe}\noindent\begin{minipage}{\textwidth}\vspace{-2mm}} +\AfterEndEnvironment{latexcode}{\vspace{-2mm}\end{minipage}\end{codeframe}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Usage} % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +In short: every concept first has to be declared using the |\NewConcept| macro. +Afterwards, its name and associated symbols can by typeset using other macros. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\DescribeMacro{\NewConcept} + \marg{concept key} \oarg{options}\\ + +Every concept needs a unique \meta{concept key}, by which it will be identified +for the rest of the document. This key can also be used to automatically +derive the name of the concept as well as the macro used to typeset the name. + +Usually, you'll also want to add \meta{options}. This optional argument takes +a comma-separated list of |key=value| pairs. The following is a list of available +options. Note that the option names are case-sensitive: +% +\begin{description} +\item[name] the name of the concept\\ + --- default: \meta{concept key} +\item[Name] the capitalized name of the concept, for use in the beginning of + a sentence\\ + --- default: \meta{name} with the first letter capitalized +\item[plural] the plural form of the name\\ + --- default: \meta{name}|s| +\item[Plural] the capitalized, pluralized name of the concept\\ + --- default: \meta{plural} with the first letter capitalized +\item[namecmd] the `short' command that may be used to typeset the name of + this concept; this option *has* to be specified for + any command to be defined, but the |=value| part may + be omitted to get the default\\ + --- default: |\|\meta{concept key} +\item[symbols] a comma-separated list of symbols that may represent instances + of this concept, delimited by curly brackets\\ + --- default: |{}| (the empty list) +\item[symbolcmd] the `short' command that may be used to typeset a + specific symbol of this concept, given a numeric index +\end{description} + +\noindent Here are a few examples which will also be used to illustrate the other commands: + +\begin{latexcode} + \NewConcept{swproduct}[ + name = software product, % options 'plural', 'Plural' + Name = Software Product, % are implicitly defined + namecmd = \product, % defines \product + symbols = {p, q, r}, % p, q, r represent products + symbolcmd = \p % defines \p + ] +\end{latexcode}\vspace{-4mm} + + \NewConcept{swproduct}[ + name = software product, % options 'plural', 'Plural' + Name = Software Product, % are implicitly defined + namecmd = \product, % defines \product + symbols = {p, q, r}, % p, q, r represent products + symbolcmd = \p % defines \p + ] + +\begin{latexcode} + \let\delta\relax % I won't be using the greek letter + \let\d\relax % or the 'dot under a letter' macro + + \NewConcept{delta}[ + namecmd, % defines \delta + symbols = {x, y, z}, % x, y and z represent deltas + symbolcmd = \d % defines \d + ] +\end{latexcode} + + \let\delta\relax % I won't be using the greek letter + \let\d\relax % or the 'dot under a letter' macro + + \NewConcept{delta}[ + namecmd, % defines \delta + symbols = {x, y, z}, % x, y and z represent deltas + symbolcmd = \d % defines \d + ] + +\noindent There are certain restrictions on new concept declarations. You may +not use the same \meta{concept key} more than once. You may not use the same +symbol for more than one concept (this is a feature; the package will +report an error if you do). Also, both \meta{namecmd} and \meta{symbolcmd} are +subject to the rules governing |\newcommand|. They may not be reused, or you +will see a standard \LaTeX{} error. Finally, any value you supply must behave +properly in an expansion-only context, e.g. be robust. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\DescribeMacro{\ConceptOption} + \marg{concept key} \marg{option key}\\ + +This command can be used to get back any option value given a +specific \meta{concept key} and \meta{option key}. For example: + +\begin{latexcode} + \ConceptOption{delta}{Plural} +\end{latexcode} + +\noindent\fbox{\ConceptOption{delta}{Plural}} + +\begin{latexcode} + \edef\prd{\ConceptOption{swproduct}{namecmd}} + {\ttfamily\expandafter\detokenize\expandafter{\prd}}% + expands to ``\prd'' +\end{latexcode} + +\noindent\fbox{% + \edef\prd{\ConceptOption{swproduct}{namecmd}}% + {\ttfamily\expandafter\detokenize\expandafter{\prd}}% + expands to ``\prd''% +}\\ + +\noindent |\ConceptOption| is `fully expandable', meaning that it can expand at +least down to the value that was given to the option. This is not guaranteed for +the |\ConceptName| and |\ConceptSymbol| commands, for instance. + +As you can observe from the |\product| example above, options that expect a +command sequence are stored with an accompanying |\noexpand|. That means that +in an |\edef| context, |\ConceptOption| expands down to the stored command but +no further. After that you can expand it further if you wish. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\DescribeMacro{\ConceptName} + \movarg{\textasciicircum} \movarg{*} \marg{concept key}\\ + +With this command you can typeset the name of the concept with \meta{concept key} +in any of four forms. The |^| modifier gives you the capitalized version. The |*| +modifier gives you the plural version. The combination gives you both. The order +between |^| and |*| doesn't matter. + +\begin{latexcode} + \ConceptName^*{delta} can transform a \ConceptName{swproduct}. +\end{latexcode} + +\noindent\fbox{\ConceptName^*{delta} can transform a \ConceptName{swproduct}.} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\noindent\\\marginnote{\meta{namecmd}} + \movarg{\textasciicircum} \movarg{*}\\ + +This is the `short' version of |\ConceptName|, specific for each concept that +was declared with the |namecmd| option. It also supports the same modifiers. + +\begin{latexcode} + \delta^* can easily transform a \product. +\end{latexcode} + +\noindent\fbox{\delta^* can easily transform a \product.} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\DescribeMacro{\ConceptSymbol} + \marg{concept key} \oarg{symbol index}\\ + +This command typesets a specific symbol associated with a a given concept. Specify +the concept by providing the \meta{concept key} and the symbol by giving the +\meta{symbol index}. + +The index is 1-based and points to a place in the symbol list provided with the +concept options. If a concept has only one allocated symbol the index may be +omitted. If there is more than one symbol, the index is mandatory. + +\begin{latexcode} + $\ConceptSymbol{delta}[2] \cdot \ConceptSymbol{delta}[1] = + \ConceptSymbol{delta}[1] \cdot \ConceptSymbol{delta}[2]$ +\end{latexcode} + +\noindent\fbox{% + $\ConceptSymbol{delta}[2] \cdot \ConceptSymbol{delta}[1] = + \ConceptSymbol{delta}[1] \cdot \ConceptSymbol{delta}[2]$% +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\noindent\\\marginnote{\meta{symbolcmd}} + \momarg{symbol index}\\ + +This is the `short' version of |\ConceptSymbol|, specific for each concept that +was declared with the |symbolcmd| option. The optional index is given directly +following the command itself (optionally with whitespace inbetween). To be +clear: the index doesn't need any delimiters. + +\begin{latexcode} + $(\d2 \cdot \d1)(\p1) = \d2(\d1(\p1)) = \d2(\p1') = \p1''$ +\end{latexcode} + +\noindent\fbox{$(\d2 \cdot \d1)(\p1) = \d2(\d1(\p1)) = \d2(\p1') = \p1''$}\\ + +\noindent As you can see, this short construct requires a lot less space than the full +|\ConceptSymbol| command, so its use is recommended for readability. + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Future Work} % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +Everything up to this version of the package has been a bit of an experiment +for me. A way to get me started. I may still fix one or two issues for the +0.0.x series, but I will soon start from scratch with all I've learned. + +There will be two major changes starting from version 0.1.0. First of all, the +package will be built on top of the |glossaries| package, which already does +much of the work I'm now doing manually. This was always the plan, as we'll +want to typeset a glossary with our concepts, and I don't want to reinvent +the wheel. The |glossaries| package is actively developed and has a great +amount of features we can take advantage of. Secondly, I will program the +0.1.0 series using \LaTeX$_3$. + +Here is an incomplete list of the features I am planning to implement: +\begin{itemize} + \item full integration with the \textsf{glossaries} package + \item commands to \emph{modify} existing concepts + \item typesetting a \emph{summary} of the concepts introduced in each chapter / section + \item typesetting \emph{sentence fragments} such as \fbox{\vphantom{W}$\d1, \d2, \d3$} + using only the code |\d[1,2,3]| + or \fbox{deltas $\d1, \d2, \d3$} using only |\delta[1,2,3]| + \item management of \emph{tuples} and \emph{sets} of concept instances + \item management of \emph{subconcepts} plus a rudimentary \emph{typesystem} that + ensures concept instances are not used where a different concept is expected +\end{itemize} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Implementation Prep % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\StopEventually{ + \PrintChanges +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\section{Implementation} % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +We now show and explain the entire implementation in |concepts.sty|. + +\DocInput{concepts.sty} + +\Finale + +\PrintIndex + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\end{document} % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/Master/texmf-dist/tex/latex/concepts/concepts.sty b/Master/texmf-dist/tex/latex/concepts/concepts.sty new file mode 100644 index 00000000000..a2f63f7f987 --- /dev/null +++ b/Master/texmf-dist/tex/latex/concepts/concepts.sty @@ -0,0 +1,568 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \iffalse %%%% +% % +% Copyright (c) 2012 - Michiel Helvensteijn (www.mhelvens.net) % +% % +% http://latex-concepts.googlecode.com % +% % +% 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 `author-maintained'. % +% % +% The Current Maintainer of this work is Michiel Helvensteijn. % +% % +% This work consists of the files concepts.dtx and concepts.sty. % +% % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \fi %%%% + +% \CheckSum{175} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Package Info} % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +% \begin{codeframe}\begin{macrocode} +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{concepts}[2012/12/08 0.0.4 + managing names and symbols of document specific formal concepts] +% \end{macrocode}\end{codeframe} + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Packages} % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +% These are the packages we'll need. +% +% \begin{codeframe}\begin{macrocode} +\RequirePackage{etextools} +\RequirePackage{nth} +\RequirePackage{xspace} +\RequirePackage{xparse} % 1 +\RequirePackage{ltxkeys}[2012/11/17] % 2 +\RequirePackage{xstring} +% \end{macrocode}\end{codeframe} +% +% We need a very recent version of |ltxkeys| in order to properly handle +% list-values. Note that |xparse| needs to be loaded before |ltxkeys| or +% things go wrong somehow. + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Facilitating Easy Data Access} % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % \begin{macro}{\cnc@d} \marg{identifier} +%%% \begin{macro}{\cnc@g} \marg{identifier}\\ +% +% This package needs to store and retrieve a lot of data. To make the rest of +% the code more readable, we define the following commands. They allow a more +% freeform description of the data. +% +% |\cnc@d| returns a control sequence name that resolves +% to a specific piece of data in |\csname| context. +% We can get access to the data itself by using |\cnc@g|. +% +% \begin{codeframe}\begin{macrocode} +\newcommand*{\cnc@d}[1]{cnc@data@#1} +\newcommand*{\cnc@g}[1]{\csuse{\cnc@d{#1}}} +% \end{macrocode}\end{codeframe} +% +% Both take an identifier of one the following shapes: +% \begin{itemize} +% \item |concepts| +% \item |concept|\parg{name}|.option|\parg{name} +% \item |concept|\parg{name}|.option|\parg{name}|.given| +% \item |concept|\parg{name}|.option|\parg{name}|.count| +% \item |concept|\parg{name}|.option|\parg{name}|.index|\parg{number} +% \item |symbol|\parg{name}|.concept| +% \end{itemize} +% +%\end{macro}\end{macro}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Private General Purpose Macros and Toggles} % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% \begin{macro}{\cnc@upper} \marg{string}\\ +% +% We're going to need a command that capitalizes the first letter of a string +% which fully expands its argument. So here it is. +% +% \begin{codeframe}\begin{macrocode} +\newcommand*{\cnc@upper}[1]{\ExpandAftercmds\MakeUppercase{#1}} +% \end{macrocode}\end{codeframe} +% +%\end{macro}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% \begin{macro}{\cnc@grabnumber} \marg{token sequence containing \#1} \momarg{number}\\ +% +% This is a command we're going to use for the automatically defined short +% symbol macros later. It has one 'real' mandatory argument and then it +% captures all numerals (0\ldots 9) that follow it. These numerals are then substituted +% for all occurrences of \#1 in the mandatory argument which is then `returned'. +% +% \begin{codeframe}\begin{macrocode} +\newcommand{\cnc@grabnumber}[1]{% + \def\cnc@dowithnum##1{#1}% + \futuredef[0123456789]{\cnc@@n}{\cnc@dowithnum{\cnc@@n}}% +} +% \end{macrocode}\end{codeframe} +% +%\end{macro}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Private Specific-purpose Macros} % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % \begin{macro}{\cnc@conceptname} \marg{plural} \marg{capitalized} +%%% \marg{plural} \marg{concept key}\\ +% +% This typesets the name of a specific concept in one of four forms. It +% can be capitalized or not; and it can be singular or plural. We define +% this private macro because there will be two public macros with this +% functionality and we want to define the behavior in only one place. +% +% The first three arguments are |xparse| style booleans. The first and +% third are the same because the public macros allow both orders between +% the |*| and |^| modifiers and we want to have a simple one-to-one +% mapping between their arguments and the arguments of this private macro. +% +% \begin{codeframe}\begin{macrocode} +\newcommand{\cnc@conceptname}[4]{% +% \end{macrocode}\end{codeframe} +% +% We test if \emph{both} the first and third arguments are true, meaning +% that the public command has two |*| modifiers. If it does, we give a +% package error. +% +% \begin{codeframe}\begin{macrocode} + \ifboolexpr{ test{\IfBooleanTF{#1}} and test{\IfBooleanTF{#3}} }{% + \PackageError{concepts}% + {You used the * modifier twice; once is enough}% + {I will pretend you just used one *.}% + }{}% +% \end{macrocode}\end{codeframe} +% +% And then we simply typeset the correct value from our datastore. +% +% \begin{codeframe}\begin{macrocode} + \ifboolexpr{ test{\IfBooleanTF{#1}} or test{\IfBooleanTF{#3}} }{% + \IfBooleanTF{#2}% + {\cnc@g{concept(#4).option(Plural)}}% + {\cnc@g{concept(#4).option(plural)}}% + }{% + \IfBooleanTF{#2}% + {\cnc@g{concept(#4).option(Name)}}% + {\cnc@g{concept(#4).option(name)}}% + }% +% \end{macrocode}\end{codeframe} +% +% We end with an |\xspace| because the public command may need one. +% +% \begin{codeframe}\begin{macrocode} + \xspace% +% \end{macrocode}\end{codeframe} +% \begin{uninterestingcodeframe}\begin{macrocode} +} +% \end{macrocode}\end{uninterestingcodeframe} +% +%\end{macro}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% \begin{macro}{\cnc@conceptsymbol} \marg{concept key} \marg{index}\\ +% +% This is the private macro which takes a concept key and an index and returns +% the corresponding symbol from our data-store. We use it in the public macros +% that offer this functionality. +% +% \begin{codeframe}\begin{macrocode} +\newcommand*{\cnc@conceptsymbol}[2]{% +% \end{macrocode}\end{codeframe} +% +% We check if an actual numerical value was passed. +% +% \begin{codeframe}\begin{macrocode} + \IfInteger{#2}{% +% \end{macrocode}\end{codeframe} +% +% If we got one, we check whether it is larger than the number of symbols +% allocated to the concept. +% +% \begin{codeframe}\begin{macrocode} + \edef\cnc@symbolcount{\cnc@g{concept(#1).option(symbols).count}}% + \ifnumcomp{#2}{>}{\cnc@symbolcount}{% +% \end{macrocode}\end{codeframe} +% +% If it is, we report an `index out of bounds' error. We first prepare an +% appropriate sentence fragment so the error message becomes more readable. +% +% \begin{codeframe}\begin{macrocode} + \edef\cnc@nth{#2\nthSuff0#2\delimiter}% + \ExpandNext\IfStrEq{\cnc@symbolcount}{0}{% + \edef\cnc@somany{no symbols}% + }{\ExpandNext\IfStrEq{\cnc@symbolcount}{1}{% + \edef\cnc@somany{only 1 symbol}% + }{% + \edef\cnc@somany{only \cnc@symbolcount\space symbols}% + }}% + \PackageError{concepts}% + {You asked for the \cnc@nth\space '#1' symbol, + but\MessageBreak the '#1' concept has + \cnc@somany\space allocated}% + {I will pretend you didn't ask for a symbol here.}% +% \end{macrocode}\end{codeframe} +% \begin{uninterestingcodeframe}\begin{macrocode} + }% +% \end{macrocode}\end{uninterestingcodeframe} +% +% But if the number is within bounds, great! We just return the stored symbol. +% +% \begin{codeframe}\begin{macrocode} + {% + \cnc@g{concept(#1).option(symbols).index(#2)}% + }% +% \end{macrocode}\end{codeframe} +% \begin{uninterestingcodeframe}\begin{macrocode} + }% +% \end{macrocode}\end{uninterestingcodeframe} +% +% Now follows the `else' branch: we didn't get a numerical index. +% +% \begin{codeframe}\begin{macrocode} + {% +% \end{macrocode}\end{codeframe} +% +% If there is only one symbol allocated to this concept, we don't care +% and return that symbol. +% +% \begin{codeframe}\begin{macrocode} + \edef\cnc@symbolcount{\cnc@g{concept(#1).option(symbols).count}}% + \ifnumcomp{\cnc@symbolcount}{=}{1}{% + \cnc@g{concept(#1).option(symbols).index(1)}% + }% +% \end{macrocode}\end{codeframe} +% +% If there are multiple symbols, the lack of an index is ambiguous and +% we report a package error. +% +% \begin{codeframe}\begin{macrocode} + {% + \PackageError{concepts}% + {You didn't specify a number, but the '#1' + \MessageBreak concept has more than one symbol + allocated; please\MessageBreak specify a number + to typeset a specific symbol}% + {I will pretend you didn't ask for a symbol here.}% + }% +% \end{macrocode}\end{codeframe} +% \begin{uninterestingcodeframe}\begin{macrocode} + }% +} +% \end{macrocode}\end{uninterestingcodeframe} +% +%\end{macro}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% \subsection{Public Macros} % +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% We now implement the macros that will be used directly by package users. +% + + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% \begin{macro}{\NewConcept} \marg{concept key} \oarg{options}\\ +% +% The |\NewConcept| macro is defined using |xparse|, since we want the +% optional argument after the mandatory one (it's just nicer). +% +% \begin{codeframe}\begin{macrocode} +\NewDocumentCommand{\NewConcept}{m O{}}{% +% \end{macrocode}\end{codeframe} +% +% Is this concept key already defined? If so, we report a package error. +% +% \begin{codeframe}\begin{macrocode} + \xifinlist{#1}{\cnc@g{concepts}}{% + \PackageError{concepts}% + {The concept key '#1' is already taken}% + {I will pretend that this '\protect\newconcept'% + didn't happen.}% + }% +% \end{macrocode}\end{codeframe} +% +% Otherwise, we start the actual processing of this new concept. +% +% \begin{codeframe}\begin{macrocode} + {% +% \end{macrocode}\end{codeframe} +% +% We add the concept to the concepts list in our datastore. +% +% \begin{codeframe}\begin{macrocode} + \listcsxadd{\cnc@d{concepts}}{#1}% +% \end{macrocode}\end{codeframe} +% +% We then check which options were explicitly specified by the user. +% This results in a set of toggles in our datastore, which may +% be used by other code. +% +% \begin{codeframe}\begin{macrocode} + \DeclareRobustCommand*{\cnc@registertoggle}[1]{% + \newtoggle{\cnc@d{concept(#1).option(##1).given}}% + \togglefalse{\cnc@d{concept(#1).option(##1).given}}% + \ltxkeys@newordkey[cnc@toggle]{#1}{##1}[]% + {\toggletrue{\cnc@d{concept(#1).option(##1).given}}}% + } + \cnc@registertoggle{name}% + \cnc@registertoggle{Name}% + \cnc@registertoggle{plural}% + \cnc@registertoggle{Plural}% + \cnc@registertoggle{namecmd}% + \cnc@registertoggle{symbols}% + \cnc@registertoggle{symbolcmd}% + \ltxkeys@setkeys*[cnc@toggle]{#1}{#2}% +% \end{macrocode}\end{codeframe} +% +% We now register the concept name options |name|, |Name|, +% |plural| and |Plural|. This is also where we set their default values. +% +% \begin{codeframe}\begin{macrocode} + \ltxkeys@newordkey[cnc]{#1}{name}% + [#1]% + {\csdef{\cnc@d{concept(#1).option(name)}}{##1}}% + \ltxkeys@newordkey[cnc]{#1}{Name}% + [\cnc@upper{\cnc@g{concept(#1).option(name)}}]% + {\csdef{\cnc@d{concept(#1).option(Name)}}{##1}}% + \ltxkeys@newordkey[cnc]{#1}{plural}% + [\cnc@g{concept(#1).option(name)}s]% + {\csdef{\cnc@d{concept(#1).option(plural)}}{##1}}% + \ltxkeys@newordkey[cnc]{#1}{Plural}% + [\cnc@upper{\cnc@g{concept(#1).option(plural)}}]% + {\csdef{\cnc@d{concept(#1).option(Plural)}}{##1}}% +% \end{macrocode}\end{codeframe} +% +% We next register the |namecmd| option. Its default value is the +% concept key with a |\| in front of it. Unlike most other options, +% though, we require the option name to be explicitly given by the +% user to actually define the macro. The following code also +% contains the test. +% +% \begin{codeframe}\begin{macrocode} + \expandaftercmds{\ltxkeys@newordkey[cnc]{#1}{namecmd}% + [}{\csname#1\endcsname}]{% + \iftoggle{\cnc@d{concept(#1).option(namecmd).given}}{% +% \end{macrocode}\end{codeframe} +% +% We register the option value as given. +% +% \begin{codeframe}\begin{macrocode} + \csdef{\cnc@d{concept(#1).option(namecmd)}}{\noexpand##1} +% \end{macrocode}\end{codeframe} +% +%%% \vphantom{x}\marginnote{\meta{namecmd}} |[*]| |[^]| |[*]|\\ +% +% \noindent If the option is processed, we define the concept-specific +% name command with the following code: +% +% \begin{codeframe}\begin{macrocode} + \NewDocumentCommand{##1}{t* t^ t*}{% + \cnc@conceptname{####1}{####2}{####3}{#1}% + }% +% \end{macrocode}\end{codeframe} +% \begin{uninterestingcodeframe}\begin{macrocode} + }{}% + }% +% \end{macrocode}\end{uninterestingcodeframe} +% +% We now register the |symbols| option. This option expects a list. +% The callback of the following code processes it one symbol at a time. +% And we first initialize the symbol counter to 0 in case the list is +% empty +% +% \begin{codeframe}\begin{macrocode} + \csdef{\cnc@d{concept(#1).option(symbols).count}}{0}% + \ltxkeys@newlistkey[cnc]{#1}{symbols}[]{% +% \end{macrocode}\end{codeframe} +% +% We check if this particular symbol is already defined. We don't want +% a symbol allocated to different concepts. Or allocated twice to the +% same concept, for that matter. If all is fine, we update the symbol +% counter for this concept, we add the symbol itself and we update +% the reverse map we use for checking duplicates. +% +% \begin{codeframe}\begin{macrocode} + \ifcsundef{\cnc@d{symbol(\detokenize{##1}).concept}}{% + \csedef{\cnc@d{concept(#1)% + .option(symbols)% + .count}}{\ltxkeys@listcount}% + \csdef{\cnc@d{concept(#1)% + .option(symbols)% + .index(\ltxkeys@listcount)}}{##1}% + \csedef{\cnc@d{symbol(\detokenize{##1}).concept}}{#1}% + }% +% \end{macrocode}\end{codeframe} +% +% If the symbol is already in use we report a package error. +% +% \begin{codeframe}\begin{macrocode} + {% + \PackageError{concepts}% + {The symbol '\detokenize{##1}' is already allocated + to the '\cnc@g{symbol(\detokenize{##1}).concept}' + concept}% + {I will pretend that you did not + try to add this symbol.}% + }% +% \end{macrocode}\end{codeframe} +% \begin{uninterestingcodeframe}\begin{macrocode} + }% +% \end{macrocode}\end{uninterestingcodeframe} +% +% We register the |symbolcmd| option. It does not really have a default, +% but we give an empty default so we can test for the empty string inside. +% +% \begin{codeframe}\begin{macrocode} + \ltxkeys@newordkey[cnc]{#1}{symbolcmd}[]{% + \ifblank{##1}{}{% +% \end{macrocode}\end{codeframe} +% +% We register the option value as given. +% +% \begin{codeframe}\begin{macrocode} + \csdef{\cnc@d{concept(#1).option(symbolcmd)}}{\noexpand##1} +% \end{macrocode}\end{codeframe} +% +%%% \vphantom{x}\marginnote{\meta{symbolcmd}} \momarg{index}\\ +% +% \noindent If the option is processed, we now define the concept-specific +% `short' command used to typeset one of the allocated symbols. It doesn't have a +% conventional argument, but it grabs all numerals following it and uses that +% as an index to the symbol. +% +% \begin{codeframe}\begin{macrocode} + \newrobustcmd*{##1}{% + \cnc@grabnumber{% + \cnc@conceptsymbol{#1}{########1}% + }% + }% +% \end{macrocode}\end{codeframe} +% \begin{uninterestingcodeframe}\begin{macrocode} + }% + }% +% \end{macrocode}\end{uninterestingcodeframe} +% +% Finally, we issue the command to parse and process all options. +% +% \begin{codeframe}\begin{macrocode} + \ltxkeys@launchkeys[cnc]{#1}{#2}% +% \end{macrocode}\end{codeframe} +% \begin{uninterestingcodeframe}\begin{macrocode} + }% +} +% \end{macrocode}\end{uninterestingcodeframe} +% +%\end{macro}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% \begin{macro}{\ConceptOption} \marg{concept key} \marg{option key}\\ +% +% The point of this command is that it can retrieve any option value +% in an expandable way. That means we can't use |xparse|, but we don't +% need it. +% +% \begin{codeframe}\begin{macrocode} +\newcommand*{\ConceptOption}[2]{% + \cnc@g{concept(#1).option(#2)}% +} +% \end{macrocode}\end{codeframe} +% +% Unfortunately, as of writing this, not all options are stored in a +% fully expandable way yet. But they will be in a later version. +% +%\end{macro}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% \begin{macro}{\ConceptName} |[*]| |[^]| |[*]| \marg{concept key}\\ +% +% This implementation simply calls our private macro for retrieving +% the name in one of four forms. +% +% \begin{codeframe}\begin{macrocode} +\NewDocumentCommand{\ConceptName}{t* t^ t* m}{% + \cnc@conceptname{#1}{#2}{#3}{#4}% +} +% \end{macrocode}\end{codeframe} +% +%\end{macro}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%% \begin{macro}{\ConceptSymbol} \marg{concept key} \oarg{index}\\ +% +% This implementation simply calls our private macro for retrieving +% the symbol with the given index. The index is optional (as it is +% in the `short' version) and defaults to 1. +% +% \begin{codeframe}\begin{macrocode} +\NewDocumentCommand{\ConceptSymbol}{m O{1}}{% + \cnc@conceptsymbol{#1}{#2}% +} +% \end{macrocode}\end{codeframe} +% +%\end{macro}%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index 28cdf31e3a1..dae509e9e60 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -108,7 +108,7 @@ my @TLP_working = qw( combelow combine combinedgraphics comfortaa comma commado commath comment compactbib complexity components-of-TeX comprehensive computational-complexity - concmath concmath-fonts concprog confproc constants + concepts concmath concmath-fonts concprog confproc constants context-account context-algorithmic context-bnf context-chromato context-construction-plan context-degrade context-filter context-fixme context-french context-fullpage diff --git a/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc b/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc index e2fc08d70af..e826cc94e23 100644 --- a/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-latexextra.tlpsrc @@ -134,6 +134,7 @@ depend combine depend comma depend commado depend comment +depend concepts depend concprog depend constants depend contour diff --git a/Master/tlpkg/tlpsrc/concepts.tlpsrc b/Master/tlpkg/tlpsrc/concepts.tlpsrc new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/Master/tlpkg/tlpsrc/concepts.tlpsrc |