diff options
Diffstat (limited to 'macros/latex/contrib/changelog/changelog.sty')
-rw-r--r-- | macros/latex/contrib/changelog/changelog.sty | 386 |
1 files changed, 242 insertions, 144 deletions
diff --git a/macros/latex/contrib/changelog/changelog.sty b/macros/latex/contrib/changelog/changelog.sty index 6c329e9a18..4c95edd805 100644 --- a/macros/latex/contrib/changelog/changelog.sty +++ b/macros/latex/contrib/changelog/changelog.sty @@ -1,4 +1,5 @@ -\ProvidesPackage{changelog}[2020/08/26 2.4.0 Typesetting changelogs] +\RequirePackage{expl3} +\ProvidesExplPackage{changelog}{2023/02/16}{2.5.0}{Typesetting changelogs} % Description: Provides the changelog environment for typesetting changelogs % License: LPPL 1.3c % Homepage: https://github.com/9999years/latex-changelog @@ -19,8 +20,6 @@ % % This work consists of the files changelog.sty and changelog.tex. -\RequirePackage{xparse} -\RequirePackage{xkeyval} \RequirePackage{translations} % See https://github.com/olivierlacan/keep-a-changelog/issues/195 @@ -95,148 +94,247 @@ \DeclareTranslation{Japanese}{changelog-Unreleased}{未公開} \DeclareTranslation{Japanese}{changelog-Yanked}{緊急変更} -\newif\ifchangelog@versionfirst -\newcommand{\changelog@item}[1]{% - \noindent - \ifchangelog@versionfirst - \changelog@versionfirstfalse - \else - \end{changelogitemize} - \fi - \textbf{#1}% - \begin{changelogitemize}% -} - -\newcommand{\changelogyanked}{\fbox{\textbf{\GetTranslation{changelog-Yanked}}}} - -\newcommand{\changelog@sectioncmds}{ - \newcommand{\added} {\changelog@item{\GetTranslation{changelog-Added}}} - \newcommand{\changed} {\changelog@item{\GetTranslation{changelog-Changed}}} - \newcommand{\deprecated}{\changelog@item{\GetTranslation{changelog-Deprecated}}} - \newcommand{\removed} {\changelog@item{\GetTranslation{changelog-Removed}}} - \newcommand{\fixed} {\changelog@item{\GetTranslation{changelog-Fixed}}} - \newcommand{\security} {\changelog@item{\GetTranslation{changelog-Security}}} - \newcommand{\misc} {\changelog@item{\GetTranslation{changelog-Miscellaneous}}} -} - -\define@cmdkeys{version}{author, version, date, changes} -\define@key{version}{v}{\def\cmdKV@version@version{#1}} -\define@boolkey{version}{yanked}[true]{} -\define@boolkey{version}{simple}[true]{} -\define@boolkey{version}{short}[true]{} - -\define@cmdkeys{changelog}{sectioncmd, title, label} -\define@boolkey{changelog}{section}[true]{} -\presetkeys{changelog}{sectioncmd=\section, title=\GetTranslation{changelog}, - label=sec:changelog, section}{} +\msg_new:nnnn { changelog } { missing_section } + { + Something's~wrong~in~version~environment;~perhaps~a~missing~ + \protect\added,~\protect\changed,~\protect\deprecated,~ + \protect\removed,~\protect\fixed,~\protect\security,~ + or~\protect\misc? + } + { + A~version~environment~needs~to~introduce~its~ + \protect\item-ized~lists~with~one~of~the~provided~section~commands;~ + maybe~you~meant~to~use~the~[simple]~option? + } + +\msg_new:nnnn { changelog } { missing_version } + { + No~versions~listed~in~changelog~environment~body. + } + { + A~changelog~environment~must~have~at~least~one~version~environment~or~ + \protect\shortversion~command~in~it. + } + +\bool_new:N \g__changelog_version_first_bool +\cs_set:Npn \changelog__item:n #1 + { + \noindent + \bool_if:NTF \g__changelog_version_first_bool + { + \bool_gset_false:N \g__changelog_version_first_bool + } + { + \end{changelogitemize} + } + \textbf{#1} + \begin{changelogitemize} + } + +\cs_set:Npn \changelogremark #1 + { + \fbox{\textbf{#1}} + } + +\cs_set:Npn \changelogyanked + { + \changelogremark{\GetTranslation{changelog-Yanked}} + } + +\tl_new:N \g__changelog_extra_section_cmds +\cs_set:Npn \changelog__define_section_cmds + { + \cs_set:Npn \added {\changelog__item:n{\GetTranslation{changelog-Added}}} + \cs_set:Npn \changed {\changelog__item:n{\GetTranslation{changelog-Changed}}} + \cs_set:Npn \deprecated {\changelog__item:n{\GetTranslation{changelog-Deprecated}}} + \cs_set:Npn \removed {\changelog__item:n{\GetTranslation{changelog-Removed}}} + \cs_set:Npn \fixed {\changelog__item:n{\GetTranslation{changelog-Fixed}}} + \cs_set:Npn \security {\changelog__item:n{\GetTranslation{changelog-Security}}} + \cs_set:Npn \misc {\changelog__item:n{\GetTranslation{changelog-Miscellaneous}}} + \tl_use:N \g__changelog_extra_section_cmds + } + +\NewDocumentCommand{\newchangelogsection}{m m} + { + \tl_gput_right:Nn \g__changelog_extra_section_cmds + { + \cs_set:Npn #1 + { + \changelog__item:n { #2 } + } + } + } + +\keys_define:nn { changelog_version } + { + author .tl_set:N = \g__changelog_author_tl , + v .tl_set:N = \g__changelog_version_tl , + version .tl_set:N = \g__changelog_version_tl , + date .tl_set:N = \g__changelog_date_tl , + changes .tl_set:N = \g__changelog_changes_tl , + yanked .bool_set:N = \g__changelog_yanked_bool , + simple .bool_set:N = \g__changelog_simple_bool , + short .bool_set:N = \g__changelog_short_bool , + remark .tl_set:N = \g__changelog_remark_tl , + remarks .clist_set:N = \g__changelog_remarks_clist , + } + +\keys_define:nn { changelog_changelog } + { + sectioncmd .tl_set:N = \g__changelog_sectioncmd_tl , + sectioncmd .initial:n = \section , + title .tl_set:N = \g__changelog_title_tl , + title .initial:n = \GetTranslation{changelog} , + label .tl_set:N = \g__changelog_label_tl , + label .initial:n = sec:changelog , + section .bool_gset:N = \g__changelog_section_bool , + section .initial:n = true , + } + +\keys_define:nn { } { changelog_changelog .inherit:n = changelog_version } \newenvironment{changelogdescription} - {\begin{description}} - {\end{description}} + {\begin{description}} + {\end{description}} \newenvironment{changelogitemize} - {\begin{itemize}} - {\end{itemize}} - -\newcommand{\changelog@section@maybe}{% - \ifKV@changelog@section - \expandafter\cmdKV@changelog@sectioncmd{\cmdKV@changelog@title}% - \expandafter\label{\cmdKV@changelog@label}% - \fi -} - -\newcommand{\changelog@shortversion@definedate}{% - \@ifundefined{cmdKV@version@version}{ - \@ifundefined{cmdKV@version@date}{ - \newcommand{\cmdKV@version@version}{\GetTranslation{changelog-Unreleased}} - \let\cmdKV@version@date\today - }{% - \let\cmdKV@version@version\cmdKV@version@date - \let\cmdKV@version@date\undefined - }% - }{}% -} - -\newcommand{\changelog@yanked@maybe} - {\ifKV@version@yanked\ \changelogyanked\fi} - -\newcommand{\changelog@shortversion@item} - {\cmdKV@version@version - \changelog@yanked@maybe} - - -\newcommand{\changelog@shortversion@authordate}{% - \@ifundefined{cmdKV@version@author}{}{\cmdKV@version@author} - \@ifundefined{cmdKV@version@date}{% - % if both undefined, add a linebreak - \@ifundefined{cmdKV@version@author}{\hspace{0pt}}{}% - }{(\cmdKV@version@date)}% -} - -\newcommand{\changelog@version@pre}{% - \par - \changelog@versionfirsttrue - \changelog@sectioncmds - \ifKV@version@simple - \begin{changelogitemize} - \fi -} -\newcommand{\changelog@version@post}{% - \ifchangelog@versionfirst - \ifKV@version@simple - \else - \PackageError{changelog}{Something's wrong in version environment; - perhaps a missing \protect\added, \protect\changed, - \protect\deprecated, \protect\removed, \protect\fixed, - \protect\security, or \protect\misc}{A version environment needs to - introduce its \protect\item-ized lists with one of the provided - section commands; maybe you meant to use the [simple] option?} - \fi - \fi - \end{changelogitemize}% -} - -\newif\ifchangelog@hadversion + {\begin{itemize}} + {\end{itemize}} + +\cs_set:Npn \changelog__section_maybe + { + \bool_if:NTF \g__changelog_section_bool + { + \exp_after:wN \g__changelog_sectioncmd_tl { \g__changelog_title_tl } + \exp_after:wN \label { \g__changelog_label_tl } + } + {} + } + +\cs_set:Npn \changelog__short_version_define_date + { + \tl_if_empty:NT \g__changelog_version_tl + { + \tl_if_empty:NTF \g__changelog_date_tl + { + \tl_set:Nn \g__changelog_version_tl { \GetTranslation{changelog-Unreleased} } + \tl_set:Nn \g__changelog_date_tl { \today } + } + { + \tl_set_eq:NN \g__changelog_version_tl \g__changelog_date_tl + } + } + } + +\cs_set:Npn \changelog__short_version_item + { + \tl_use:N \g__changelog_version_tl + \bool_if:NT \g__changelog_yanked_bool + { + \ \changelogyanked + } + \tl_if_empty:NF \g__changelog_remark_tl + { + \ \changelogremark{\tl_use:N \g__changelog_remark_tl} + } + \clist_if_empty:NF \g__changelog_remarks_clist + { + \clist_map_variable:NNn \g__changelog_remarks_clist \l__changelog_remark_tl + { + \ \changelogremark{\tl_use:N \l__changelog_remark_tl} + } + } + } + +\cs_set:Npn \changelog__short_version_author_date + { + \tl_use:N \g__changelog_author_tl + \tl_if_empty:NF \g__changelog_date_tl + { + \tl_if_empty:NF \g__changelog_author_tl + { ~ } + (\tl_use:N \g__changelog_date_tl) + } + } + +\cs_set:Npn \changelog__version_pre + { + \par + \bool_gset_true:N \g__changelog_version_first_bool + \changelog__define_section_cmds + \bool_if:NT \g__changelog_simple_bool + { + \begin{changelogitemize} + } + } + +\cs_set:Npn \changelog__version_post + { + \bool_if:NT \g__changelog_version_first_bool + { + \bool_if:NF \g__changelog_simple_bool + { + \msg_error:nn { changelog } { missing_section } + } + } + \end{changelogitemize} + } + +\bool_new:N \g__changelog_seen_version_bool \NewDocumentEnvironment{changelog}{o} - {\global\changelog@hadversionfalse - \IfValueT{#1}{\setkeys{changelog, version}{#1}}% - \changelog@section@maybe - %\today - % version environment; wraps a list - \NewDocumentEnvironment{version}{ O{} }% - {\setkeys{version}{##1}% - \@shortversion - \ifKV@version@short - \else - \changelog@version@pre - \fi} - {\ifKV@version@short - \else - \changelog@version@post - \fi}% - - % doesn't set keys so this can share code with the version - % environment - \NewDocumentCommand{\@shortversion}{}{% - \changelog@shortversion@definedate - \global\changelog@hadversiontrue - \item[\changelog@shortversion@item]% - \changelog@shortversion@authordate - \ifKV@version@short - \ --- - \@ifundefined{cmdKV@version@changes}{}{\cmdKV@version@changes}% - \fi - }% - - % short version; "like" a 1-bullet list - % extra braces keep command definitions local - \NewDocumentCommand{\shortversion}{m}{{% - \setkeys{version}{##1, short}% - \@shortversion - }}% - \begin{changelogdescription}} - {\ifchangelog@hadversion - \else - \PackageError{changelog}{No versions in changelog environment body}{A - changelog environment must have at least one version or shortversion in - it.}% - \fi\end{changelogdescription}} + { + \bool_gset_false:N \g__changelog_seen_version_bool + \IfValueT{#1}{\keys_set:nn{changelog_changelog}{#1}} + \changelog__section_maybe + + % Define the version environment, which wraps an `itemize`-style list. + \NewDocumentEnvironment{version}{ O{} } + { + \keys_set:nn { changelog_version } { ##1 } + \changelog__short_version + + \bool_if:NF \g__changelog_short_bool + { + \changelog__version_pre + } + } + { + \bool_if:NF \g__changelog_short_bool + { + \changelog__version_post + } + } + + % doesn't set keys so this can share code with the version + % environment + \cs_set:Npn \changelog__short_version + { + \changelog__short_version_define_date + \bool_gset_true:N \g__changelog_seen_version_bool + + \item[\changelog__short_version_item] + \changelog__short_version_author_date + + \bool_if:NT \g__changelog_short_bool + { + \ ---\ \tl_use:N \g__changelog_changes_tl + } + } + + % A short version; "like a 1-bullet list. + \NewDocumentCommand{\shortversion}{m} + % The extra braces here keep the keys we set local. + {{ + \keys_set:nn{changelog_version}{##1, short} + \changelog__short_version + }} + + \begin{changelogdescription} + } + { + \bool_if:NF \g__changelog_seen_version_bool + { + \msg_error:nn { changelog } { missing_version } + } + + \end{changelogdescription} + } |