% \iffalse meta-comment % %% File: l3sys.dtx Copyright (C) 2015 The LaTeX3 Project %% %% It may be distributed and/or modified under the conditions of the %% LaTeX Project Public License (LPPL), either version 1.3c of this %% license or (at your option) any later version. The latest version %% of this license is in the file %% %% http://www.latex-project.org/lppl.txt %% %% This file is part of the "l3kernel bundle" (The Work in LPPL) %% and all files in that bundle must be distributed together. %% %% The released version of this bundle is available from CTAN. %% %% ----------------------------------------------------------------------- %% %% The development version of the bundle can be found at %% %% http://www.latex-project.org/svnroot/experimental/trunk/ %% %% for those people who are interested. %% %%%%%%%%%%% %% NOTE: %% %%%%%%%%%%% %% %% Snapshots taken from the repository represent work in progress and may %% not work or may contain conflicting material! We therefore ask %% people _not_ to put them into distributions, archives, etc. without %% prior consultation with the LaTeX3 Project. %% %% ----------------------------------------------------------------------- % %<*driver> \documentclass[full]{l3doc} % %<*driver|package> \GetIdInfo$Id: l3sys.dtx 6087 2015-09-25 10:29:53Z joseph $ {L3 Experimental system/runtime functions} % %<*driver> \begin{document} \DocInput{\jobname.dtx} \end{document} % % \fi % % \title{^^A % The \pkg{l3sys} package\\System/runtime functions^^A % \thanks{This file describes v\ExplFileVersion, % last revised \ExplFileDate.}^^A % } % % \author{^^A % The \LaTeX3 Project\thanks % {^^A % E-mail: % \href{mailto:latex-team@latex-project.org} % {latex-team@latex-project.org}^^A % }^^A % } % % \date{Released \ExplFileDate} % % \maketitle % % \begin{documentation} % % \section{The name of the job} % % \begin{variable}[added = 2015-09-19]{\c_sys_jobname_str} % Constant that gets the \enquote{job name} assigned when \TeX{} starts. % \begin{texnote} % This copies the contents of the primitive \tn{jobname}. It is a constant % that is set by \TeX{} and should not be overwritten by the package. % \end{texnote} % \end{variable} % % \section{Date and time} % % \begin{variable}[added = 2015-09-22] % { % \c_sys_minute_int, % \c_sys_hour_int, % \c_sys_day_int, % \c_sys_month_int, % \c_sys_year_int, % } % The date and time at which the current job was started: these are % all reported as integers. % \begin{texnote} % Whilst the underlying primitives can be altered by the user, this % interface to the time and date is intended to be the \enquote{real} % values. % \end{texnote} % \end{variable} % % \subsection{Engine} % % \begin{function}[added = 2015-09-07, EXP, pTF] % { % \sys_if_engine_luatex:, % \sys_if_engine_pdftex:, % \sys_if_engine_ptex: , % \sys_if_engine_uptex: , % \sys_if_engine_xetex: % } % \begin{syntax} % \cs{sys_if_engine_pdftex:TF} \Arg{true code} \Arg{false code} % \end{syntax} % Conditionals which allow engine-specific code to be used. The names % follow naturally from those of the engine binaries: note that the % |(u)ptex| tests are for \epTeX{} and \eupTeX{} as \pkg{expl3} requires % the \eTeX{} extensions. Each conditional is true for % \emph{exactly one} supported engine. In particular, % |\sys_if_engine_ptex_p:| is true for \epTeX{} but false for \eupTeX{}. % \end{function} % % \begin{variable}[added = 2015-09-19]{\c_sys_engine_str} % The current engine given as a lower case string: will be one of % |luatex|, |pdftex|, |ptex|, |uptex| or |xetex|. % \end{variable} % % \subsection{Output format} % % \begin{function}[added = 2015-09-19, EXP, pTF] % { % \sys_if_output_dvi:, % \sys_if_output_pdf: % } % \begin{syntax} % \cs{sys_if_output_dvi:TF} \Arg{true code} \Arg{false code} % \end{syntax} % Conditionals which give the current output mode the \TeX{} run is % operating in. This will always be one of two outcomes, DVI mode or % PDF mode. The two sets of conditionals are thus complementary and % are both provided to allow the programmer to emphasise the most % appropriate case. % \end{function} % % \begin{variable}[added = 2015-09-19]{\c_sys_output_str} % The current output mode given as a lower case string: will be one of % |dvi| or |pdf|. % \end{variable} % % \end{documentation} % % \begin{implementation} % % \section{\pkg{l3sys} implementation} % % \begin{macrocode} %<*initex|package> % \end{macrocode} % % \subsection{The name of the job} % % \begin{variable}{\c_sys_jobname_str} % Inherited from the \LaTeX3 name for the primitive: this needs to % actually contain the text of the job name rather than the name of % the primitive, of course. % \begin{macrocode} %<*initex> \tex_everyjob:D \exp_after:wN { \tex_the:D \tex_everyjob:D \str_const:Nx \c_sys_jobname_str { \tex_jobname:D } } % %<*package> \str_const:Nx \c_sys_jobname_str { \tex_jobname:D } % % \end{macrocode} % \end{variable} % % \subsection{Time and date} % % \begin{variable} % { % \c_sys_minute_int, % \c_sys_hour_int, % \c_sys_day_int, % \c_sys_month_int, % \c_sys_year_int, % } % Copies of the information provided by \TeX{} % \begin{macrocode} \int_const:Nn \c_sys_minute_int { \int_mod:nn { \tex_time:D } { 60 } } \int_const:Nn \c_sys_hour_int { \int_div_truncate:nn { \tex_time:D } { 60 } } \int_const:Nn \c_sys_day_int { \tex_day:D } \int_const:Nn \c_sys_month_int { \tex_month:D } \int_const:Nn \c_sys_year_int { \tex_year:D } % \end{macrocode} % \end{variable} % % \subsection{Detecting the engine} % % \begin{macro}[pTF, EXP] % { % \sys_if_engine_luatex:, % \sys_if_engine_pdftex:, % \sys_if_engine_ptex:, % \sys_if_engine_uptex:, % \sys_if_engine_xetex: % } % \begin{variable}{\c_sys_engine_str} % Set up the engine tests on the basis exactly one test should be true. % Mainly a case of looking for the appropriate marker primitive. For % \upTeX{}, there is a complexity in that setting |-kanji-internal=sjis| % or |-kanji-internal=euc| effective makes it more like \pTeX{}. In those % cases we therefore report \pTeX{} rather than \upTeX{}. % \begin{macrocode} \clist_map_inline:nn { lua , pdf , p , up , xe } { \cs_new_eq:cN { sys_if_engine_ #1 tex:T } \use_none:n \cs_new_eq:cN { sys_if_engine_ #1 tex:F } \use:n \cs_new_eq:cN { sys_if_engine_ #1 tex:TF } \use_ii:nn \cs_new_eq:cN { sys_if_engine_ #1 tex_p: } \c_false_bool } \cs_if_exist:NT \luatex_luatexversion:D { \cs_gset_eq:NN \sys_if_engine_luatex:T \use:n \cs_gset_eq:NN \sys_if_engine_luatex:F \use_none:n \cs_gset_eq:NN \sys_if_engine_luatex:TF \use_i:nn \cs_gset_eq:NN \sys_if_engine_luatex_p: \c_true_bool \str_const:Nn \c_sys_engine_str { luatex } } \cs_if_exist:NT \pdftex_pdftexversion:D { \cs_gset_eq:NN \sys_if_engine_pdftex:T \use:n \cs_gset_eq:NN \sys_if_engine_pdftex:F \use_none:n \cs_gset_eq:NN \sys_if_engine_pdftex:TF \use_i:nn \cs_gset_eq:NN \sys_if_engine_pdftex_p: \c_true_bool \str_const:Nn \c_sys_engine_str { pdftex } } \cs_if_exist:NT \ptex_kanjiskip:D { \bool_if:nTF { \cs_if_exist_p:N \uptex_disablecjktoken:D && \int_compare_p:nNn { \ptex_jis:D "2121 } = { "3000 } } { \cs_gset_eq:NN \sys_if_engine_uptex:T \use:n \cs_gset_eq:NN \sys_if_engine_uptex:F \use_none:n \cs_gset_eq:NN \sys_if_engine_uptex:TF \use_i:nn \cs_gset_eq:NN \sys_if_engine_uptex_p: \c_true_bool \str_const:Nn \c_sys_engine_str { uptex } } { \cs_gset_eq:NN \sys_if_engine_ptex:T \use:n \cs_gset_eq:NN \sys_if_engine_ptex:F \use_none:n \cs_gset_eq:NN \sys_if_engine_ptex:TF \use_i:nn \cs_gset_eq:NN \sys_if_engine_ptex_p: \c_true_bool \str_const:Nn \c_sys_engine_str { ptex } } } \cs_if_exist:NT \xetex_XeTeXversion:D { \cs_gset_eq:NN \sys_if_engine_xetex:T \use:n \cs_gset_eq:NN \sys_if_engine_xetex:F \use_none:n \cs_gset_eq:NN \sys_if_engine_xetex:TF \use_i:nn \cs_gset_eq:NN \sys_if_engine_xetex_p: \c_true_bool \str_const:Nn \c_sys_engine_str { xetex } } % \end{macrocode} % \end{variable} % \end{macro} % % \subsection{Detecting the output} % % \begin{macro}[pTF, EXP] % { % \sys_if_output_dvi:, % \sys_if_output_pdf: % } % \begin{variable}{\c_sys_output_str} % This is a simple enough concept: the two views here are complementary. % \begin{macrocode} \bool_if:nTF { \cs_if_exist_p:N \pdftex_pdfoutput:D && \int_compare_p:nNn \pdftex_pdfoutput:D > \c_zero } { \cs_new_eq:NN \sys_if_output_dvi:T \use_none:n \cs_new_eq:NN \sys_if_output_dvi:F \use:n \cs_new_eq:NN \sys_if_output_dvi:TF \use_ii:nn \cs_new_eq:NN \sys_if_output_dvi_p: \c_false_bool \cs_new_eq:NN \sys_if_output_pdf:T \use:n \cs_new_eq:NN \sys_if_output_pdf:F \use_none:n \cs_new_eq:NN \sys_if_output_pdf:TF \use_i:nn \cs_new_eq:NN \sys_if_output_pdf_p: \c_true_bool \str_const:Nn \c_sys_output_str { pdf } } { \cs_new_eq:NN \sys_if_output_dvi:T \use:n \cs_new_eq:NN \sys_if_output_dvi:F \use_none:n \cs_new_eq:NN \sys_if_output_dvi:TF \use_i:nn \cs_new_eq:NN \sys_if_output_dvi_p: \c_true_bool \cs_new_eq:NN \sys_if_output_pdf:T \use_none:n \cs_new_eq:NN \sys_if_output_pdf:F \use:n \cs_new_eq:NN \sys_if_output_pdf:TF \use_ii:nn \cs_new_eq:NN \sys_if_output_pdf_p: \c_false_bool \str_const:Nn \c_sys_output_str { dvi } } % \end{macrocode} % \end{variable} % \end{macro} % % \subsection{Deprecated functions} % % Deprecated 2015-09-07 for removal after 2016-12-31. The older logic supported % only three engines so that has to be allowed for. % \begin{macrocode} \prg_new_eq_conditional:NNn \luatex_if_engine: \sys_if_engine_luatex: { T , F , TF , p } \prg_new_eq_conditional:NNn \xetex_if_engine: \sys_if_engine_xetex: { T , F , TF , p } \bool_if:nTF { \sys_if_engine_luatex_p: || \sys_if_engine_xetex_p: } { \cs_new_eq:NN \pdftex_if_engine:T \use_none:n \cs_new_eq:NN \pdftex_if_engine:F \use:n \cs_new_eq:NN \pdftex_if_engine:TF \use_ii:nn \cs_new_eq:NN \pdftex_if_engine_p: \c_false_bool } { \cs_new_eq:NN \pdftex_if_engine:T \use:n \cs_new_eq:NN \pdftex_if_engine:F \use_none:n \cs_new_eq:NN \pdftex_if_engine:TF \use_i:nn \cs_new_eq:NN \pdftex_if_engine_p: \c_true_bool } % \end{macrocode} % % Deprecated 2015-09-19 for removal after 2016-12-31. % \begin{macrocode} \cs_set_eq:NN \c_job_name_tl \c_sys_jobname_str % \end{macrocode} % % \begin{macrocode} % % \end{macrocode} % %\end{implementation} % %\PrintIndex