
Ich verwende dasmiamiSchriftart, um kurze (ein paar Zeilen) handgeschriebene Texte zu simulieren. Da die Schriftart eher hell ist, verwende ich eine Anpassung vonSteven B. SegletesLösung von So fetten Sie benutzerdefinierten kalligrafischen Text
- Das Problem ist, dass, wenn es
\BODY
als\calbf
Argument angegeben wird, alle Zeilenumbrüche verschluckt werden. (Aber es verarbeitet UTF-8-Zeichen mit deutschen Umlauten usw. gut). Das hat nichts mit der Schriftart miama zu tun. Zeilenumbrüche werden auch ohne sie beeinflusst. Ich wundere mich auch über die Tatsache, dass der Aufruf
\calbf
wie in der letzten (auskommentierten) Zeile gezeigt diesen Fehler auslöst:! Paket-Inputenc-Fehler: Ungültige UTF-8-Bytefolge.
Eine Erklärung finden Sie in der Dokumentation zum inputenc-Paket. Geben Sie H ein, um sofort Hilfe zu erhalten. ...
l.61 ...á é ó í ú \ldots \"e \"i \"a \"o \"u} Code hier eingeben
Kann mir jemand zeigen, wie ich (insbesondere) mit Problem 1 umgehen kann?
\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{environ}
\usepackage[scale=1]{miama}
\usepackage{stackengine}
\def\useanchorwidth{T}
\def\stacktype{L}
\def\stackalignment{l}
\def\calup{.2pt}
\def\calover{.15pt}
\def\calbf#1{\calbfhelpA#1 \relax\relax}
\def\calbfhelpA#1 #2\relax{%
\calbfhelpB#1\relax\relax%
\ifx\relax#2\else\ \calbfhelpA#2\relax\fi
}
\def\calbfhelpB#1#2\relax{%
\stackon[\calup]{#1}{\kern\calover#1}%
\ifx\relax#2\else
\calbfhelpB#2\relax%
\fi
}
\NewEnviron{MyCal}%
{%
\fmmfamily%
\noindent%
\calbf{Test0}\\ \BODY \\\\ \calbf{\BODY}%
}
\begin{document}
\def\calup{.3pt}
\def\calover{.3pt}
\begin{MyCal}
MyCal:\\
Test1: ä.ö.ü.Ä.Ö.Ü.ß.\ss.
\par
á é ó í ú
\"e \"i \"a \"o \"u
\end{MyCal}
\par\vspace{1em}
%\calbf{ä.ö.ü.Ä.Ö.Ü.ß.\ss \ldots á é ó í ú \ldots \"e \"i \"a \"o \"u}
\end{document}
Antwort1
Versuchen Sie dies für Problem 1. Von Problem 2 verstehe ich nicht genug, um zu versuchen, es zu lösen.
Das Hauptproblem war, dass die ursprüngliche Version von \calbf
überhaupt keine Erweiterungsbehandlung hatte. Was also passierte, war, dass \calbf
ein einzelnes Token sah \BODY
und es einfach weitergab und sagte \stackon[\calup]{\BODY}{\kern\calover\BODY}
. Der Grund, warum \calbf
versucht, jeweils ein Token weiterzugeben, \calup
liegt vermutlich darin, dass die Weiterleitung eines ganzen Textblocks den Zeilenumbruch zerstört.
Daher \calbf
hilft es, das Argument zu erweitern. Ich verwende den \romannumeral
Trick, um das erste Token von rekursiv zu erweitern \calbfhelpA
. In diesem Fall ist das erste Token \BODY
und es wird erweitert und gibt den Rest von allem aus.
Dann tritt ein weiteres Problem auf, nämlich dass der einzige Grund, warum es \"a
vorher funktioniert hat, zu sagen, darin bestand, dass \calbf
die einzelnen Zeichen der Eingabe nicht erfolgreich getrennt werden konnten, weil alles in war \BODY
. Die Lösung erfordert einen Test innerhalb von , \calbfhelpB
ob das erste Argument ein Makro ist. Wenn das erste Argument ein Makro ist, speichern Sie es und greifen Sie auch auf das nächste Token zu. Wir bekommen auch Probleme, wenn wir ein \par
oder \\
Token sehen, also testen wir diese separat.
\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{environ}
\usepackage[scale=1]{miama}
\usepackage{stackengine}
\def\useanchorwidth{T}
\def\stacktype{L}
\def\stackalignment{l}
\def\calup{.2pt}
\def\calover{.15pt}
\makeatletter
% Terminal token to signal end of input.
% We give it a unique definition so that `\ifx\endtoken\anythingelse` always tests false.
% Since we're using fexpansion, we need an extra `\noexpand` to prevent it from getting
% turned into something else.
\def\calbf@endtoken{\noexpand\calbf@endtoken}
% Use \romannumeral trick to "f expand" argument
% We are going to parse by spaces, so we need to add a terminal space and \relax
% so we can tell when we are done.
\def\calbf#1{\expandafter\calbf@\romannumeral-`0#1 \calbf@endtoken}
% Needs to be \long in case argument is a \par token.
% #1 - a single word
\long\def\calbf@#1 {%
\calbf@handleword{}#1\calbf@endtoken
% Check if we are done. If not, fexpand rest of input and recurse.
\@ifnextchar\calbf@endtoken{}{\ \expandafter\calbf@\romannumeral-`0}%
}
% Helper macro to test for equality.
\long\def\calbf@ifx#1#2{%
\ifx#1#2\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
}
% Test if argument is a macro (checks if \string#1 contains multiple characters).
\long\def\calbf@ifmacro#1{%
\expandafter\ifx\expandafter$\romannumeral-`0\expandafter\@gobble\string#1$%
\expandafter\@secondoftwo
\else
\expandafter\@firstoftwo
\fi
}
\long\def\calbf@handleword#1#2{%
\calbf@ifx{#2}{\calbf@endtoken}{}{% we're done with this word
\calbf@ifx{#2}{\par}{%
#2\calbf@handleword{}% just pass \par tokens through
}{%
\calbf@ifx{#2}{\\}{%
#2\calbf@handleword{}% just pass \\ tokens through
}{%
\calbf@ifmacro#2{% If it's an accent, save it and grab the argument too.
\calbf@handleword{#1#2}%
}{%
\stackon[\calup]{#1{#2}}{\kern\calover#1{#2}}% Otherwise print it.
\calbf@handleword{}%
}%
}}}%
}
\NewEnviron{MyCal}{%
%\fmmfamily
\noindent
\calbf{Test0}\\ \BODY \\\\
\calbf{\BODY}%
}
\makeatother
\begin{document}
\def\calup{.3pt}
\def\calover{.3pt}
\"{ab}
\begin{MyCal}
MyCal:\\
Test1: %ä.ö.ü.Ä.Ö.Ü.ß.\ss.
\par
abcd
\"e \"i \"a \"o \"u \"e\"i\"a\"o\"u \"{abcd} {1234}
\end{MyCal}
\par\vspace{1em}
%\calbf{ä.ö.ü.Ä.Ö.Ü.ß.\ss \ldots á é ó í ú \ldots \"e \"i \"a \"o \"u}
\end{document}