Как сделать жирным рукописный текст

Как сделать жирным рукописный текст

Я используюмайамашрифт для имитации коротких (пара строк) рукописных фрагментов текста. Поскольку шрифт довольно светлый, я использую адаптациюСтивен Б. Сеглетеcрешение от Как сделать жирным каллиграфический текст

  1. Проблема в том, что при указании \BODYв качестве \calbfаргумента он поглощает все переносы строк. (Но он хорошо обрабатывает символы UTF-8 с немецкими умлаутами и т. д.). Это не имеет никакого отношения к шрифту miama. Переносы строк затрагиваются и без него.
  2. Меня также удивляет тот факт, что вызов, \calbfпоказанный в последней (закомментированной) строке, вызывает эту ошибку:

    ! Ошибка пакета inputenc: недопустимая последовательность байтов UTF-8.

    Для получения объяснений см. документацию пакета inputenc. Введите H для немедленной помощи. ...

    l.61 ...á é ó í ú \ldots \"e \"i \"a \"o \"u} введите код здесь

Может ли кто-нибудь показать мне, как справиться (особенно) с проблемой 1?

\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}

решение1

Попробуйте это для проблемы 1. Я недостаточно понимаю проблему 2, чтобы попытаться решить ее.

Основная проблема заключалась в том, что в оригинальной версии \calbfвообще не было обработки расширения. Так что произошло то, что \calbfувидел один токен \BODYи просто передал его и сказал \stackon[\calup]{\BODY}{\kern\calover\BODY}. Причина, по которой \calbfпытаются передать один токен за \calupраз, предположительно заключается в том, что передача целого блока текста уничтожает перенос строк.

Поэтому изменение \calbfна расширение его аргумента помогает. Я использую \romannumeralтрюк, чтобы рекурсивно расширить первый токен \calbfhelpA. В этом случае первый токен — это \BODY, и он расширяется и выгружает все остальное.

Затем возникает другая проблема, которая заключается в том, что единственная причина, по которой это работало, чтобы сказать \"aраньше, заключалась в том, \calbfчто не было успешного разделения отдельных символов ввода, поскольку все было в \BODY. Исправление требует проверки внутри, \calbfhelpBявляется ли первый аргумент макросом. Если первый аргумент является макросом, сохраните его и также возьмите следующий токен. Мы также сталкиваемся с проблемой, если видим токен \parили \\, поэтому мы проверяем их отдельно.

\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} 

Связанный контент