% !TEX TS-program = lualatex

\documentclass{article}

\usepackage{cmgraded}
\usepackage{newunicodechar}
\usepackage{accsupp}

\pagestyle{empty}

% German low quotes by lowering a closing quote to comma height.
% Used to be how already the pre-babel german.sty file did it since about 1987.
\newcommand{\CMGlowquote}[2]{% #1 = ActualText (hex)  #2 = high quote to lower
  \BeginAccSupp{method=hex,unicode,ActualText=#1}%
    \leavevmode
    \setbox0=\hbox{,}\setbox2=\hbox{#2}%
    \dimen0=\ht2 \advance\dimen0 by -\ht0
    \lower\dimen0\box2\relax
  \EndAccSupp{}}
\newunicodechar{„}{\CMGlowquote{201E}{\textquotedblright}}% „ = lowered ”
\newunicodechar{‚}{\CMGlowquote{201A}{\textquoteright}}%   ‚ = lowered ’

% French guillemets by raising small math ≪ and ≫ slightly.
% Is how babel does it at least in PDFLaTeX since about 1996.
\newcommand{\CMGguillemet}[2]{% #1 = ActualText (hex)  #2 = \ll or \gg
  \BeginAccSupp{method=hex,unicode,ActualText=#1}%
    \leavevmode\raise0.25ex\hbox{$\scriptscriptstyle#2$}%
  \EndAccSupp{}}
\newunicodechar{«}{\CMGguillemet{00AB}{\ll}}% « opening
\newunicodechar{»}{\CMGguillemet{00BB}{\gg}}% » closing

% Lowered umlauts, the way german.sty has seated them since the 1980s
% and babel still does for OT1/PDFLaTeX: temporarily enlarge the font
% x-height so that TeX's \accent primitive seats the dieresis a little
% lower.  The .45ex is german.sty's constant; it self-adjusts for capitals.
\newcommand{\CMGlowumlaut}[2]{% #1 = ActualText (hex)  #2 = base letter
  \BeginAccSupp{method=hex,unicode,ActualText=#1}%
    \leavevmode
    \begingroup
      \dimen0=\fontdimen5\font % save the x-height
      \setbox0=\hbox{\char"00A8}% the dieresis ¨
      \dimen2=\ht0 \advance\dimen2 by -.45\dimen0
      \ifdim\dimen0<\dimen2 \fontdimen5\font=\dimen2 \fi
      \accent"00A8 \fontdimen5\font=\dimen0 #2%
    \endgroup
  \EndAccSupp{}}
\newunicodechar{ä}{\CMGlowumlaut{00E4}{a}}
\newunicodechar{ö}{\CMGlowumlaut{00F6}{o}}
\newunicodechar{ü}{\CMGlowumlaut{00FC}{u}}
\newunicodechar{Ä}{\CMGlowumlaut{00C4}{A}}
\newunicodechar{Ö}{\CMGlowumlaut{00D6}{O}}
\newunicodechar{Ü}{\CMGlowumlaut{00DC}{U}}

\begin{document}

\section*{\textsf{Computer Modern Graded – Emulate Glyphs}}

How to assemble some glyphs in ways in which they
were assembled in the past by some language packages,
such that you can use the Unicode characters
directly in the source
and also get correct Unicode characters
when copying text from the resulting PDF,
at least with many mainstream PDF viewers.

See the \LaTeX\ source of this document for how it is done.

And copy the lines below out of the PDF:
With a reader that honours \texttt{/ActualText}
you get the corresponding Unicode characters:

\begin{itemize}

\item
\texttt{\small U+201E} / \texttt{\small U+201A}:
closing quotes ” and ’ lowered to the baseline

\vspace{-2mm}
\item
\texttt{\small U+00AB} / \texttt{\small U+00BB}:
small, slightly raised math symbols $\ll$ and $\gg$

\vspace{-2mm}
\item
\texttt{\small U+00E4}\,\dots\,\texttt{\small U+00DC}:
umlauts with lowered dots

\end{itemize}

\noindent
Note that even though the source
for all these examples may look rather complex,
today with AI
you could just ask a capable one (e.g.\ Claude Code)
to create the \LaTeX\ source
for your desired additional glyphs.

\subsection*{\textsf{German low Quotes}}

\begin{itemize}

\item „Ein Wort und ein Satz.“

\vspace{-2mm}
\item „Er sagte ‚ja‘ dazu.“

\end{itemize}

\subsection*{\textsf{French Guillemets}}

\begin{itemize}

\item «\,un mot\,» et «\,une phrase\,».

\end{itemize}

\subsection*{\textsf{German lowered Umlauts}}

\begin{itemize}

\item Ärztehaus, Öltanker, Übermut, Mädchen, schön, für.

\end{itemize}

\vspace{1mm}
\noindent
\textsf{Sans works too: „Wort“, ‚wort‘, «\,mot\,», Fähre, Überfahrt.}

\end{document}
