

% fixjfm-doc.tex

% !TeX encoding = UTF-8
% !TeX program  = pdfLaTeX

\RequirePackage{fix-cm}

\documentclass[a4paper]{article}

\usepackage{amsfonts}
\usepackage[OT1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[UKenglish]{babel}
\usepackage[babel]{microtype}
\usepackage{etoolbox}
\usepackage{booktabs}

\AtBeginEnvironment{verbatim}{\microtypesetup{activate=false}}

\abovetopsep=\medskipamount

\newcommand\NormalSans{\normalfont\sffamily}
\newcommand\pkg[1]{{\protect\NormalSans#1}}

\newcommand\pTeX{p\kern-0.15em\TeX}
\newcommand\e{\ensuremath{\varepsilon}}
\newcommand\epTeX{\e-\pTeX}
\newcommand\ApTeX{A\kern-0.1em\pTeX}
\newcommand\pLaTeX{p\LaTeX}

\newcommand\FwBox{\ensuremath{\square}\hskip0em plus 0.05em\relax}

\newbox\fwbox
\setbox\fwbox=\hbox{\FwBox}

\newcommand\TwoFwBoxes{\FwBox\FwBox}
\newcommand\FourFwBoxes{\TwoFwBoxes\TwoFwBoxes}

\newcommand\DemoText{%
  \FourFwBoxes\FourFwBoxes\FourFwBoxes\FourFwBoxes
  \FourFwBoxes\FourFwBoxes\ensuremath{\square}}

\newcommand\demotext[1]{%
  \begin{minipage}{20\wd\fwbox}\centering
    \fbox{\begin{minipage}{16\wd\fwbox}%
      \hskip2\wd\fwbox\relax\DemoText\par
      \leavevmode\hbox to#1\wd\fwbox{\hss``}\DemoText''\par
      \hskip2\wd\fwbox\relax\DemoText\par
    \end{minipage}}%
  \end{minipage}}

\newcommand\yes{yes}
\newcommand\no{no}

\newcommand\eclmvtt{test}

\font\eclmvtt=ec-lmvtt10 at 10pt

\newcommand\demoinput[2]{\TwoFwBoxes
  \hbox to 1\wd\fwbox{\texttt{,}\hss}#1%
  \hbox to 1\wd\fwbox{\hss{\eclmvtt``}}\TwoFwBoxes
  \hbox to 1\wd\fwbox{{\eclmvtt''}\hss}#2}

\newcommand\demooutput[2]{%
  \TwoFwBoxes\hbox to#1\wd\fwbox{,\hss{#2``}}\TwoFwBoxes{#2''}}

\newcommand\sans{test}

\font\sans=SourceSansPro-Semibold-tlf-ot1 at 10pt

\newenvironment{history}[1]%
  {\noindent\textbf{#1}\nopagebreak\relax\begin{itemize}}%
  {\end{itemize}}

\begin{document}

\title{The \pkg{fixjfm} package%
  \thanks{CTAN Homepage: \texttt{https://ctan.org/pkg/fixjfm}}
  \thanks{Repository: \texttt{https://github.com/Man-Ting-Fang/fixjfm}}}
\author{Yue \textsc{Zhang}}
\date{2018-03-24\quad v0.8}

\maketitle

\begin{abstract}
This package fixes several bugs in the JFM format. Both \LaTeX\ and plain \TeX\
are supported.
\end{abstract}

\section{Introduction}

The JFM format is an extension of the TFM format and is used for typesetting CJK
characters with *\pTeX. It works perfectly under almost all circumstances, but
there are still at least two bugs:
\begin{itemize}
\item Bug 1: the indentation is incorrect if the first character of a paragraph
  is an opening fullwidth punctuation mark, see Figure \ref{fig:ind};
\item Bug 2: the spacing between two consecutive fullwidth punctuation marks
  cannot be adjusted if the font is changed there, see Table \ref{tab:adj}.
\end{itemize}
\begin{figure}[!ht]\centering
\demotext{3}\demotext{2.5}
\caption{Comparison of the indentation produced without this package (left) and
  with this package (right)}
\label{fig:ind}
\end{figure}
\vskip-20pt\relax
\begin{table}[!ht]\centering
\caption{Comparison of the adjustment of the spacing between two consecutive
  fullwidth punctuation marks}
\label{tab:adj}
\begin{tabular}{ccll}
\toprule
Font change & This package        & Input          & Output                  \\
\midrule
\no         & either \no\ or \yes & \demoinput{}{} & \demooutput{1.5}{}      \\
\yes        & \no                 & \demoinput{\texttt{\char"5C textgt%
                                      \char"7B}}{\texttt{\char"7D}}
                                                   & \demooutput{2}{\sans}   \\
\yes        & \yes                & \demoinput{\texttt{\char"5C textgt%
                                      \char"7B}}{\texttt{\char"7D}}
                                                   & \demooutput{1.5}{\sans} \\
\bottomrule
\end{tabular}
\end{table}
It seems that macro is the easiest solution to these problems. However, the
second bug can only be fixed when using \e-(u)\pTeX\ or \ApTeX\ (under most, but
not all circumstances), because the primitive \verb|\lastnodechar| which is
introduced by \epTeX\ is required. Anyhow, using this package with \pTeX\ or any
one of its derivatives does not hurt. Please also keep in mind that owing to
technical limitations, this package is not a panacea.

There is also another improvement: \verb|\leavevmode| is redefined as
\verb|\quitvmode| if the latter is available as a primitive (among all *\pTeX\
engines to date, only \ApTeX\ has \verb|\quitvmode|). So after loading this
package, you can always use \verb|\leavevmode| and need not worry about
\verb|\quitvmode|. If you are wondering about what the difference between them
is, please see \textit{The pdf\TeX\ user manual}.

\section{Basic usage}

This package has no options. It is recommended that this package should be
loaded before any other packages. If you are using \LaTeX, load this package at
the beginning of your preamble:
\begin{verbatim}
    \documentclass...
    \usepackage{fixjfm}
\end{verbatim}
or even before \verb|\documentclass| (use \verb|\RequirePackage| instead):
\begin{verbatim}
    \RequirePackage{fixjfm}
    \documentclass...
\end{verbatim}
If you are using plain \TeX, put the following line near the beginning of your
\verb|.tex| file:
\begin{verbatim}
    \input fixjfm.sty
\end{verbatim}

After loading this package, the first bug mentioned above can be automatically
fixed under most (but not all) circumstances. If you find that it cannot be
fixed somewhere, you can add \verb|\<| manually before the opening fullwidth
punctuation mark which begins the paragraph.

In the case of the second bug mentioned above, the situation is different. If
you are using \LaTeX, \verb|\textmc| and \verb|\textgt| are redefined by default
so that the bug can be automatically fixed (again, under most, but not all
circumstances). However, \verb|\mcfamily| and \verb|\gtfamily| remain unchanged.
The difference here is similar to that between, say, \verb|\textit| and
\verb|\itshape|: \verb|\textit| automatically takes care of any necessary italic
correction on either side of the argument, while \verb|\itshape| does nothing
about that. Just like \verb|\itshape| and \verb|\/|, you should add
\begin{verbatim}
    \fixjfmspacing
\end{verbatim}
by yourself after the font change that appears between two consecutive fullwidth
punctuation marks. For example:
\begin{trivlist}\item\relax{\ttfamily\hskip2em}\TwoFwBoxes
\hbox to 1\wd\fwbox{\texttt{,}\hss}\verb|{\gtfamily\fixjfmspacing|%
\hbox to 1\wd\fwbox{\hss{\eclmvtt``}}\TwoFwBoxes
\hbox to 1\wd\fwbox{{\eclmvtt''}\hss}\verb|}\fixjfmspacing|%
\hbox to 1\wd\fwbox{\hss{\eclmvtt``}}\TwoFwBoxes
\hbox to 1\wd\fwbox{{\eclmvtt''}\hss}%
\end{trivlist}
If you are using plain \TeX, you should always add \verb|\fixjfmspacing| by
yourself, because plain (*p)\TeX\ does not have \verb|\textmc|, \verb|\textgt|,
or the like.

If you are using \LaTeX\ and prefer the standard version\footnote{Since v0.3,
the ``standard version'' is similar to \pkg{jsclasses} and \pkg{bxjscls} rather
than (u)\pLaTeX.} of \verb|\textmc| and \verb|\textgt|, you can declare
\begin{verbatim}
    \UseStandardCJKTextFontCommands
\end{verbatim}
In contrast,
\begin{verbatim}
    \UseFixJFMCJKTextFontCommands
\end{verbatim}
redefines \verb|\textmc| and \verb|\textgt| and is declared by default. These
two commands are important. Consider the following example:
\begin{trivlist}
\item\relax{\ttfamily\hskip2em}\verb|\textgt{\Large |\TwoFwBoxes\verb|}|
\end{trivlist}
It causes a fatal error when the \pkg{fixjfm} version of \verb|\textgt| is used.
The solution is to change \verb|\textgt| back to the standard version, either
globally or locally:
\begin{trivlist}\itemsep=0pt\relax\parsep=0pt\relax
\item\relax{\ttfamily\hskip2em}%
\verb|\UseFixJFMCJKTextFontCommands   \textgt{|\TwoFwBoxes\verb|}|
\item\relax{\ttfamily\hskip2em}%
\verb|\UseStandardCJKTextFontCommands \textgt{\Large |\TwoFwBoxes\verb|}|
\item\relax{\ttfamily\hskip2em}%
\verb|\UseFixJFMCJKTextFontCommands   \textgt{|\TwoFwBoxes\verb|}|
\item\relax{\ttfamily\hskip1.5em}%
\verb|{\UseStandardCJKTextFontCommands \textgt{\Large |\TwoFwBoxes\verb|}}|
\end{trivlist}

\section{Advanced usage}

The spacing between two consecutive fullwidth punctuation marks is produced by
a glue item specified in the corresponding JFM file. However, if the font is
changed there, the JFM format cannot work correctly, so this package puts
another glue item there to adjust the spacing. The natural width of the new glue
item is calculated according to the corresponding JFM file, so you need not
worry about it. However, the stretch and shrink components cannot be extracted
from JFM, so the following two commands are provided:
\begin{verbatim}
    \SetFixJFMSpacingStretch
    \SetFixJFMSpacingShrink
\end{verbatim}
They expect an argument specifying how much space to stretch and shrink
respectively. This package sets both of them to \verb|0.05zw| by default.

Macro writers may want to (re)define commands like the \pkg{fixjfm} version of
\verb|\textmc| and \verb|\textgt| for CJK text fonts, thus the following command
is provided:
\begin{verbatim}
    \DeclareFixJFMCJKTextFontCommand
\end{verbatim}
It is similar to \LaTeX's \verb|\DeclareTextFontCommand|. For example,
\verb|\textmc| is redefined by this package as follows:
\begin{verbatim}
    \DeclareFixJFMCJKTextFontCommand\textmc{\mcfamily}
\end{verbatim}
and \verb|\textgt| is similar. In contrast,
\begin{verbatim}
    \DeclareStandardCJKTextFontCommand
\end{verbatim}
(re)defines a CJK text font command like the standard version of \verb|\textmc|
and \verb|\textgt|. But there is a more convenient way: Suppose that you have a
new CJK text font command \verb|\xyfamily|, then
\begin{verbatim}
    \AppendToUseXCJKTextFontCommands{\textxy}{\xyfamily}
\end{verbatim}
will do all you need and makes \verb|\Use...CJKTextFontCommands| also apply to
\verb|\textxy|. This command and \verb|\Use...CJKTextFontCommands| can be given
in any order, so you do not need to redeclare
\verb|\UseFixJFMCJKTextFontCommands| (which is the default behaviour) if that is
what you want.

Finally, there are several macros that may be useful for \TeX nicians:
\begin{verbatim}
    \FixJFMSpacing
    \fixjfmparindent
    \FixJFMParindent
    \EveryparPreHook
    \EveryparPostHook
    \ifUseFixJFMCJKTextFontCommands
    \ifUseStandardCJKTextFontCommands
\end{verbatim}
They are worthless for ordinary use. If you are interested in them, please have
a look at the source code.

\section{Compatibility}

The \LaTeX-only package \pkg{bxjaprnind} also focuses on the first bug mentioned
above. It provides some additional functionalities and also supports some other
\TeX\ engines. This package can be used together with \pkg{bxjaprnind}, but
please note that if you prefer \pkg{bxjaprnind}, you have to load it before this
package, and vice versa, in case both of them are loaded.

\section{Acknowledgements}

The source code of this package is mostly taken from\footnote{This package also
improves the code slightly.} (in alphabetical order):
\epTeX\ Wiki (Hironori Kitagawa):
\begin{verbatim}
    https://ja.osdn.net/projects/eptex/wiki/lastnodechar
\end{verbatim}
\pkg{everyhook} (Stephen Checkoway):
\begin{verbatim}
    https://ctan.org/pkg/everyhook
\end{verbatim}
\pkg{jsclasses} (Haruhiko Okumura et al.):
\begin{verbatim}
    https://ctan.org/pkg/jsclasses
\end{verbatim}
and \pkg{platex} (Kazuki Maeda \& Japanese \TeX\ Development Community):
\begin{verbatim}
    https://ctan.org/pkg/platex
\end{verbatim}
Many thanks to the authors of these packages. I would also like to thank
Hironobu Yamashita, who helped me a lot.

\section{History}

\begin{history}{2017-09-02 v0.2}
\item First public version.
\end{history}

\begin{history}{2017-09-04 v0.3}
\item Fixes.
\item Make \verb|\UseFixJFMCJKTextFontCommands| and
  \verb|\UseStandardCJKTextFontCommands| also available after
  \verb|\begin{document}|.
\item Add \verb|\DeclareStandardCJKTextFontCommand| and use it for redefining
  the standard version of \verb|\textmc| and \verb|\textgt|.
\end{history}
Thanks to Hironobu Yamashita for suggesting all these changes:
\begin{verbatim}
    https://github.com/Man-Ting-Fang/fixjfm/pull/1
\end{verbatim}

\begin{history}{2017-09-04 v0.4}
\item Bug fix, thanks to Hironobu Yamashita:
\end{history}
\begin{verbatim}
    https://github.com/Man-Ting-Fang/fixjfm/pull/2
\end{verbatim}

\begin{history}{2017-09-12 v0.5}
\item Bug fix, thanks to Hironobu Yamashita:
\end{history}
\begin{verbatim}
    https://github.com/Man-Ting-Fang/fixjfm/issues/3
\end{verbatim}

\begin{history}{2017-09-21 v0.6}
\item Bug fix and improvement, thanks to Hironobu Yamashita:
\end{history}
\begin{verbatim}
    https://github.com/Man-Ting-Fang/fixjfm/pull/4
\end{verbatim}

\begin{history}{2017-12-27 v0.7}
\item Add \verb|\ifUseFixJFMCJKTextFontCommands| and
  \verb|\ifUseStandardCJKTextFontCommands|.
\end{history}

\begin{history}{2018-03-24 v0.8}
\item Add \verb|\AppendToUseXCJKTextFontCommands|.
\end{history}

\end{document}
