Wenn ich mache:
\message{^^J! my very long message that will be cut on many lines because LaTeX for some weird reasons like to manually cut the lines instead of letting the terminal do it^^J}
Ich werde so etwas im Protokoll sehen:
! my very long message that will be cut on many lines because LaTeX for some we
ird reasons like to manually cut the lines instead of letting the terminal do i
t
Ich möchte aber !
allen Zeilen ein voranstellen, da TeXstudio nur Zeilen, die mit einem beginnen, !
als Fehler druckt. Wie kann ich automatisch ein Symbol hinzufügen, wenn im Protokoll eine neue Zeile erstellt wird?
MWE
\documentclass[]{article}
\begin{document}
\message{! my very long message that will be cut on many lines because LaTeX for some weird reasons like to manually cut the lines instead of letting the terminal do it}
\end{document}
BEARBEITEN: Zur Klarstellung: Ich möchte, dass das Protokoll Folgendes enthält:
! my very long message that will be cut on many lines because LaTeX for some we
! ird reasons like to manually cut the lines instead of letting the terminal do
! it
(oder noch besser, wenn es an Wortgrenzen umbrechen könnte, aber hey, lasst uns nicht zu viel verlangen)
Antwort1
Hier stelle ich vor \xmessage
, das eine erweiterte Nachricht annimmt und sie beim ersten Leerzeichen abbricht, das eine festgelegte Grenze überschreitet (hier 40 Zeichen). Jede neue Zeile beginnt mit einem !
Zeichen.
Beachten Sie, dass jede beliebige Befehlssequenz \xmessage
nur als ein einzelnes Zeichen zählt.
\documentclass[]{article}
\usepackage{tokcycle}
\newcounter{charcount}
\makeatletter
\newcommand\xmessage[1]{\bgroup%
\aftertokcycle{\typeout{! \the\cytoks}}%
\tokcycle{\addcytoks{##1}\stepcounter{charcount}}
{\processtoks{##1}}
{\addcytoks{##1}\stepcounter{charcount}}
{\addcytoks{##1}\stepcounter{charcount}\splitline}{#1}%
\egroup}
\newcommand\splitline{%
\ifnum\value{charcount}>40\typeout{! \the\cytoks}%
\setcounter{charcount}{0}\cytoks{}\fi}
\begin{document}
\xmessage{my very long message that will be cut on many lines because LaTeX for some weird reasons like to manually cut the lines instead of letting the terminal do it}
\end{document}
Antwort2
Teilen Sie die Eingabe (möglicherweise nach vollständiger Erweiterung mit der *
-Variante) an Leerzeichen auf und bereiten Sie dann die Nachricht vor, indem Sie die Gesamtlänge der Zeile berechnen und die Entscheidung zum Abbruch treffen, wenn das max_print_line
Limit überschritten wird.
\documentclass{article}
\ExplSyntaxOn
% get the current length of error lines
\sys_get_shell:nnN { kpsewhich ~ -var-value=error_line } {} \l_tmpa_tl
\int_const:Nn \c__tobiasbora_prefixmessage_limit_int { \l_tmpa_tl }
\NewDocumentCommand{\prefixmessage}{sO{!}m}
{
\IfBooleanTF { #1 }
{
\tobiasbora_prefixmessage:ne { #2 } { #3 }
}
{
\tobiasbora_prefixmessage:nn { #2 } { #3 }
}
}
\seq_new:N \l__tobiasbora_prefixmessage_text_seq
\str_new:N \l__tobiasbora_prefixmessage_text_str
\int_new:N \l__tobiasbora_prefixmessage_len_int
\cs_new_protected:Nn \tobiasbora_prefixmessage:nn
{
\seq_set_split:Nne \l__tobiasbora_prefixmessage_text_seq { ~ } { \tl_to_str:n { #2 } }
% start up
\str_set:Nn \l__tobiasbora_prefixmessage_text_str { #1 }
\int_zero:N \l__tobiasbora_prefixmessage_len_int
% prepare the string to output
\seq_map_inline:Nn \l__tobiasbora_prefixmessage_text_seq
{
\int_add:Nn \l__tobiasbora_prefixmessage_len_int { \str_count:n { ##1 } + 1 }
\int_compare:nNnTF
{ \l__tobiasbora_prefixmessage_len_int }
>
{ \c__tobiasbora_prefixmessage_limit_int - \str_count:n { #1 } }
{
\str_put_right:Nn \l__tobiasbora_prefixmessage_text_str { ^^J #1 ~ ##1 }
\int_set:Nn \l__tobiasbora_prefixmessage_len_int { \str_count:n { ##1 } + 1 }
}
{
\str_put_right:Nn \l__tobiasbora_prefixmessage_text_str { ~ ##1 }
}
}
% output
\iow_term:e { ^^J \l__tobiasbora_prefixmessage_text_str ^^J }
}
\cs_generate_variant:Nn \tobiasbora_prefixmessage:nn { ne }
\ExplSyntaxOff
\prefixmessage{my very long message that will be cut on many
lines because \LaTeX for some weird reasons like to manually
cut the lines instead of letting the terminal do it}
\def\foo{(something in the middle)}
\prefixmessage*[>>>]{my very long message that will be cut on many
lines because LaTeX \foo\space for some weird reasons like to manually
cut the lines instead of letting the terminal do it}
\stop
Ausgabe auf dem Terminal und in der Logdatei
! my very long message that will be cut on many lines because \LaTeX for some
! weird reasons like to manually cut the lines instead of letting the terminal
! do it
>>> my very long message that will be cut on many lines because LaTeX
>>> (something in the middle) for some weird reasons like to manually cut the
>>> lines instead of letting the terminal do it
Antwort3
Eine andere Version mit LaTeX3: Zeilen werden durch getrennt \robExtPrefixLogMessage
(wenn Sie es in Ihrem Code verwenden, wählen Sie andere Namen, damit es nicht zu Konflikten mit meiner CTAN-Bibliothek kommt) und mit dem Präfix versehen \robExtPrefixLogMessage
.
\def\robExtMessageWithPrefixNumberLines{^^J}%
\cs_new:Nn \robExt__message_with_prefix:n {
\str_set:Nn \l_tmpa_str {#1}
\int_compare:nNnTF {\str_count:N \l_tmpa_str + \str_count:N \robExtPrefixLogMessage} > {78} {
\typeout{\robExtPrefixLogMessage \str_range:Nnn \l_tmpa_str {1} {78 - \str_count:N \robExtPrefixLogMessage}\robExtMessageWithPrefixNumberLines}
\robExt__message_with_prefix:x {\str_range:Nnn \l_tmpa_str {78 - \str_count:N \robExtPrefixLogMessage + 1} {-1}}
}{
\typeout{\robExtPrefixLogMessage \l_tmpa_str \robExtMessageWithPrefixNumberLines}
}
}
\cs_generate_variant:Nn \robExt__message_with_prefix:n { x }