%% %% This is file `l3msg.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% l3msg.dtx (with options: `package') %% %% %% EXPERIMENTAL CODE %% %% Do not distribute this file without also distributing the %% source files specified above. %% %% Do not distribute a modified version of this file. %% %% %% File: l3msg.dtx Copyright (C) 2009 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 ``expl3 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 LaTeX Project Team. %% %% ----------------------------------------------------------------------- %% \RequirePackage{l3names} \GetIdInfo$Id: l3msg.dtx 1722 2009-11-06 13:22:12Z joseph $ {L3 Experimental LaTeX Messages module} \ProvidesExplPackage {\filename}{\filedate}{\fileversion}{\filedescription} \package_check_loaded_expl: \int_set:Nn \tex_errorcontextlines:D { \c_minus_one } \tl_new:Nn \c_msg_fatal_tl { Fatal~Error } \tl_new:Nn \c_msg_error_tl { Error } \tl_new:Nn \c_msg_warning_tl { Warning } \tl_new:Nn \c_msg_info_tl { Info } \tl_new:Nn \c_msg_fatal_text_tl { This~is~a~fatal~error:~LaTeX~will~abort } \tl_new:Nn \c_msg_help_text_tl { For~immediate~help~type~H~ } \tl_new:Nn \c_msg_kernel_bug_text_tl { This~is~a~LaTeX~bug:~check~coding! } \tl_new:Nn \c_msg_kernel_bug_more_text_tl { There~is~a~coding~bug~somewhere~around~here. \msg_newline: This~probably~needs~examining~by~an~expert. \c_msg_return_text_tl } \tl_new:Nn \c_msg_no_info_text_tl { LaTeX~does~not~know~anything~more~about~this~error,~sorry. \c_msg_return_text_tl } \tl_new:Nn \c_msg_return_text_tl { \msg_two_newlines: Try~typing~~to~proceed. \msg_newline: If~that~doesn't~work,~type~X~~to~quit } \group_begin: \char_make_letter:N\ % \tl_to_lowercase:n{% \group_end:% \tl_new:Nn% \c_msg_hide_tl % {}% }% \tl_new:Nn \c_msg_on_line_tl { on~line } \tl_new:Nn \c_msg_text_prefix_tl { msg_text ~>~ } \tl_new:Nn \c_msg_more_text_prefix_tl { msg_text_more ~>~ } \tl_new:N \l_msg_class_tl \tl_new:N \l_msg_current_class_tl \clist_new:N \l_msg_names_clist \prop_new:N \l_msg_redirect_classes_prop \prop_new:N \l_msg_redirect_names_prop \clist_new:N \l_msg_redirect_classes_clist \cs_new_nopar:Npn \msg_line_number: { \toks_use:N \tex_inputlineno:D } \cs_new_nopar:Npn \msg_line_context: { \c_msg_on_line_tl \msg_space: \msg_line_number: } \cs_new_nopar:Npn \msg_newline: { ^^J } \cs_new_nopar:Npn \msg_two_newlines: { ^^J ^^J } \cs_new_nopar:Npn \msg_space: { ~ } \cs_new_nopar:Npn \msg_two_spaces: { \msg_space: \msg_space: } \cs_new_nopar:Npn \msg_four_spaces: { \msg_two_spaces: \msg_two_spaces: } \cs_new_nopar:Npn \msg_generic_new:nnn #1 { \chk_if_free_cs:c { \c_msg_text_prefix_tl #1 :xxxx } \msg_generic_set:nnn {#1} } \cs_new_nopar:Npn \msg_generic_new:nn #1 { \chk_if_free_cs:c { \c_msg_text_prefix_tl #1 :xxxx } \msg_generic_set:nn {#1} } \cs_new_nopar:Npn \msg_generic_set:nnn #1 { \msg_generic_set_clist:n {#1} \char_make_space:N \ \msg_generic_set_more_text:nnn {#1} } \cs_new_nopar:Npn \msg_generic_set:nn #1 { \msg_generic_set_clist:n {#1} \char_make_space:N \ \msg_generic_set_text:nn {#1} } \cs_new_nopar:Npn \msg_generic_set_clist:n #1 { \clist_if_in:NnF \l_msg_names_clist { // #1 / } { \clist_put_right:Nn \l_msg_names_clist { // #1 / } } } \cs_new:Npn \msg_generic_set_text:nn #1#2 { \cs_set:cpn { \c_msg_text_prefix_tl #1 :xxxx } ##1##2##3##4 {#2} \cs_set_eq:cN { \c_msg_more_text_prefix_tl #1 :xxxx } \c_undefined \char_make_ignore:N \ } \cs_new:Npn \msg_generic_set_more_text:nnn #1#2#3 { \cs_set:cpn { \c_msg_text_prefix_tl #1 :xxxx } ##1##2##3##4 {#2} \cs_set:cpn { \c_msg_more_text_prefix_tl #1 :xxxx } ##1##2##3##4 {#3} \char_make_ignore:N \ } \group_begin: \char_set_lccode:nn {`\&} {`\ } % { \char_set_lccode:w `\} = `\ \scan_stop: \char_make_active:N \& \char_make_letter:N\ % \tl_to_lowercase:n{% \group_end:% \cs_new_protected:Npn\msg_direct_interrupt:xxxx#1#2#3#4{% \group_begin:% \cs_set_eq:NN\\\msg_newline:% \cs_set_eq:NN\ \msg_space:% \msg_direct_interrupt_aux:n{#4}% \cs_set_nopar:Npn\\{\msg_newline:#3}% \tex_errhelp:D\l_msg_tmp_tl% \cs_set:Npn&{% \tex_errmessage:D{% #1\msg_newline:% #2\msg_two_newlines:% \c_msg_help_text_tl% \c_msg_hide_tl % }% }% &% \group_end:% }% }% \cs_new:Npn \msg_direct_interrupt_aux:n #1 { \tl_if_empty:nTF {#1} { \tl_set:Nx \l_msg_tmp_tl { { \c_msg_no_info_text_tl } } }{ \tl_set:Nx \l_msg_tmp_tl { {#1} } } } \cs_new_protected:Npn \msg_direct_log:xx #1#2 { \group_begin: \cs_set:Npn \\ { \msg_newline: #2 } \cs_set_eq:NN \ \msg_space: \iow_log:x { #1 \msg_newline: } \group_end: } \cs_new_protected:Npn \msg_direct_term:xx #1#2 { \group_begin: \cs_set:Npn \\ { \msg_newline: #2 } \cs_set_eq:NN \ \msg_space: \iow_term:x { #1 \msg_newline: } \group_end: } \cs_new_nopar:Npn \msg_new:nnnn #1#2 { \msg_generic_new:nnn { #1 / #2 } } \cs_new_nopar:Npn \msg_new:nnn #1#2 { \msg_generic_new:nn { #1 / #2 } } \cs_new_nopar:Npn \msg_set:nnnn #1#2 { \msg_generic_set:nnn { #1 / #2 } } \cs_new_nopar:Npn \msg_set:nnn #1#2 { \msg_generic_set:nn { #1 / #2 } } \cs_new_nopar:Npn \msg_class_new:nn #1 { \chk_if_free_cs:c { msg_ #1 :nnxxxx } \prop_new:c { l_msg_redirect_ #1 _prop } \msg_class_set:nn {#1} } \cs_new_nopar:Npn \msg_class_set:nn #1#2 { \prop_clear:c { l_msg_redirect_ #1 _prop } \cs_set_protected:cpn { msg_ #1 :nnxxxx } ##1##2##3##4##5##6 { \msg_use:nnnnxxxx {#1} {#2} {##1} {##2} {##3} {##4} {##5} {##6} } \cs_set_protected:cpx { msg_ #1 :nnxxx } ##1##2##3##4##5 { \exp_not:c { msg_ #1 :nnxxxx } {##1} {##2} {##3} {##4} {##5} { } } \cs_set_protected:cpx { msg_ #1 :nnxx } ##1##2##3##4 { \exp_not:c { msg_ #1 :nnxxxx } {##1} {##2} {##3} {##4} { } { } } \cs_set_protected:cpx { msg_ #1 :nnx } ##1##2##3 { \exp_not:c { msg_ #1 :nnxxxx } {##1} {##2} {##3} { } { } { } } \cs_set_protected:cpx { msg_ #1 :nn } ##1##2 { \exp_not:c { msg_ #1 :nnxxxx } {##1} {##2} { } { } { } { } } } \cs_new:Npn \msg_use:nnnnxxxx #1#2#3#4#5#6#7#8 { \cs_set_nopar:Npn \msg_use_code: { \clist_clear:N \l_msg_redirect_classes_clist #2 } \cs_set:Npn \msg_use_loop:n ##1 { \clist_if_in:NnTF \l_msg_redirect_classes_clist {#1} { \msg_kernel_error:nn { msg } { redirect-loop } {#1} }{ \clist_put_right:Nn \l_msg_redirect_classes_clist {#1} \cs_if_exist:cTF { msg_ ##1 :nnxxxx } { \use:c { msg_ ##1 :nnxxxx } {#3} {#4} {#5} {#6} {#7} {#8} }{ \msg_kernel_error:nnx { msg } { message-class-unknown } {##1} } } } \cs_if_exist:cTF { \c_msg_text_prefix_tl #3 / #4 :xxxx } { \msg_use_aux:nnn {#1} {#3} {#4} }{ \msg_kernel_error:nnxx { msg } { message-unknown } {#3} {#4} } } \cs_new_nopar:Npn \msg_use_code: { } \cs_new:Npn \msg_use_loop:n #1 { } \cs_new_nopar:Npn \msg_use_aux:nnn #1#2#3 { \tl_set:Nn \l_msg_current_class_tl {#1} \tl_set:Nn \l_msg_current_module_tl {#2} \prop_if_in:NnTF \l_msg_redirect_names_prop { // #2 / #3 / } { \msg_use_loop_check:nn { names } { // #2 / #3 / } }{ \msg_use_aux:nn {#1} {#2} } } \cs_new_nopar:Npn \msg_use_aux:nn #1#2 { \prop_if_in:cnTF { l_msg_redirect_ #1 _prop } {#2} { \msg_use_loop_check:nn {#1} {#2} }{ \prop_if_in:cnTF { l_msg_redirect_ #1 _prop } { * } { \msg_use_loop_check:nn {#1} { * } }{ \msg_use_code: } } } \cs_new:Npn \msg_use_loop_check:nn #1#2 { \prop_get:cnN { l_msg_redirect_ #1 _prop } {#2} \l_msg_class_tl \tl_if_eq:NNTF \l_msg_current_class_tl \l_msg_class_tl { \msg_use_code: }{ \msg_use_loop:n { \l_msg_class_tl } } } \msg_class_new:nn { fatal } { \msg_direct_interrupt:xxxx { \c_msg_fatal_tl \msg_two_newlines: } { ( \c_msg_fatal_tl ) \msg_space: \use:c { \c_msg_text_prefix_tl #1 / #2 :xxxx } {#3} {#4} {#5} {#6} } { ( \c_msg_fatal_tl ) \msg_space: } { \c_msg_fatal_text_tl } \tex_end:D } \msg_class_new:nn { error } { \msg_direct_interrupt:xxxx { #1~\c_msg_error_tl \msg_newline: } { ( #1 ) \msg_space: \use:c { \c_msg_text_prefix_tl #1 / #2 :xxxx } {#3} {#4} {#5} {#6} } { ( #1 ) \msg_space: } { \cs_if_exist:cTF { \c_msg_more_text_prefix_tl #1 / #2 :xxxx } { \use:c { \c_msg_more_text_prefix_tl #1 / #2 :xxxx } {#3} {#4} {#5} {#6} } { \c_msg_no_info_text_tl } } } \msg_class_new:nn { warning } { \msg_direct_term:xx { \msg_space: #1 ~ \c_msg_warning_tl :~ \use:c { \c_msg_text_prefix_tl #1 / #2 :xxxx } {#3} {#4} {#5} {#6} } { ( #1 ) \msg_two_spaces: } } \msg_class_new:nn { info } { \msg_direct_log:xx { \msg_space: #1~\c_msg_info_tl :~ \use:c { \c_msg_text_prefix_tl #1 / #2 :xxxx } {#3} {#4} {#5} {#6} } { ( #1 ) \msg_two_spaces: } } \msg_class_new:nn { log } { \msg_direct_log:xx { \use:c { \c_msg_text_prefix_tl #1 / #2 :xxxx } {#3} {#4} {#5} {#6} } { } } \msg_class_new:nn { trace } { \msg_direct_log:xx { \use:c { \c_msg_text_prefix_tl #1 / #2 :xxxx } {#3} {#4} {#5} {#6} } { } } \msg_class_new:nn { none } { } \cs_new_nopar:Npn \msg_redirect_class:nn #1#2 { \prop_put:cnn { l_msg_redirect_ #1 _prop } { * } {#2} } \cs_new_nopar:Npn \msg_redirect_module:nnn #1#2#3 { \prop_put:cnn { l_msg_redirect_ #2 _prop } {#1} {#3} } \cs_new_nopar:Npn \msg_redirect_name:nnn #1#2#3 { \prop_put:Nnn \l_msg_redirect_names_prop { // #1 / #2 / } {#3} } \cs_new_nopar:Npn \msg_kernel_new:nnnn #1#2 { \msg_new:nnnn { LaTeX } { #1 / #2 } } \cs_new_nopar:Npn \msg_kernel_new:nnn #1#2 { \msg_new:nnn { LaTeX } { #1 / #2 } } \cs_new_nopar:Npn \msg_kernel_set:nnnn #1#2 { \msg_set:nnnn { LaTeX } { #1 / #2 } } \cs_new_nopar:Npn \msg_kernel_set:nnn #1#2 { \msg_set:nnn { LaTeX } { #1 / #2 } } \cs_new_nopar:Npn \msg_kernel_classes_new:n #1 { \cs_new_protected:cpx { msg_kernel_ #1 :nnxxx } ##1##2##3##4##5 { \exp_not:c { msg_kernel_ #1 :nnxxxx } {##1} {##2} {##3} {##4} {##5} { } } \cs_new_protected:cpx { msg_kernel_ #1 :nnxx } ##1##2##3##4 { \exp_not:c { msg_kernel_ #1 :nnxxxx } {##1} {##2} {##3} {##4} { } { } } \cs_new_protected:cpx { msg_kernel_ #1 :nnx } ##1##2##3 { \exp_not:c { msg_kernel_ #1 :nnxxxx } {##1} {##2} {##3} { } { } { } } \cs_new_protected:cpx { msg_kernel_ #1 :nn } ##1##2 { \exp_not:c { msg_kernel_ #1 :nnxxxx } {##1} {##2} { } { } { } { } } } \cs_new_protected:Npn \msg_kernel_fatal:nnxxxx #1#2#3#4#5#6 { \msg_direct_interrupt:xxxx { \c_msg_fatal_tl \msg_two_newlines: } { ( LaTeX ) \msg_space: \use:c { \c_msg_text_prefix_tl LaTeX / #1 / #2 :xxxx } {#3} {#4} {#5} {#6} } { ( LaTeX ) \msg_space: } { \c_msg_fatal_text_tl } \tex_end:D } \msg_kernel_classes_new:n { fatal } \cs_new_protected:Npn \msg_kernel_error:nnxxxx #1#2#3#4#5#6 { \msg_direct_interrupt:xxxx { LaTeX~\c_msg_error_tl \msg_newline: } { ( LaTeX ) \msg_space: \use:c { \c_msg_text_prefix_tl LaTeX / #1 / #2 :xxxx } {#3} {#4} {#5} {#6} } { ( LaTeX ) \msg_space: } { \cs_if_exist:cTF { \c_msg_more_text_prefix_tl LaTeX / #1 / #2 :xxxx } { \use:c { \c_msg_more_text_prefix_tl LaTeX / #1 / #2 :xxxx } {#3} {#4} {#5} {#6} } { \c_msg_no_info_text_tl } } } \msg_kernel_classes_new:n { error } \cs_new_protected_nopar:Npn \msg_kernel_warning:nnxxxx #1#2 { \msg_warning:nnxxxx { LaTeX } { #1 / #2 } } \msg_kernel_classes_new:n { warning } \cs_new_protected_nopar:Npn \msg_kernel_info:nnxxxx #1#2 { \msg_info:nnxxxx { LaTeX } { #1 / #2 } } \msg_kernel_classes_new:n { info } \msg_kernel_new:nnnn { msg } { message-unknown } {Unknown message `#2' for module `#1'.} {% LaTeX was asked to display a message by the `#1' module.\\% The message was supposed to be called `#2', but I can't\\% find a message with that name.% \c_msg_return_text_tl } \msg_kernel_new:nnnn { msg } { message-class-unknown } {Unknown message class `#1'.} {% You have asked for a message to be redirected to class `#1'.\\% The message class `#1' has not been set up:\\% perhaps this is a typing error.% \c_msg_return_text_tl } \msg_kernel_new:nnnn { msg } { redirect-loop } {Message redirection loop for message class `#1'.} {% You have asked for a message to be redirected,\\% but the redirection instructions form a loop:\\% you've lost the message.% \c_msg_return_text_tl } \cs_set_protected:Npn \msg_kernel_bug:x #1 { \msg_direct_interrupt:xxxx { \c_msg_kernel_bug_text_tl } { !~#1 } { ! } { \c_msg_kernel_bug_more_text_tl } } %% %% %% End of file `l3msg.sty'.