如何将 HP 50G 中的代码转录到 LaTeX 中

如何将 HP 50G 中的代码转录到 LaTeX 中

我有 HP 48/50G 系列的代码,如下图所示。

在此处输入图片描述

我使用 [lstlisting] 所做的最接近的操作显示在下面的代码片段中。

\begin{lstlisting}
<< SWAP DUP SIZE 
HEAD 1 - -> J vec N
<< 0 N FOR k vec k 1 
+ GET i NEG 2 * pi *
k * J * N 1 + / EXP 
* NEXT N 1 + -> LIST sum LIST
>> >>
\end{lstlisting}

在此处输入图片描述

有没有什么办法可以改进成和HP截图一样呢?

答案1

这看上去好些了吗?

\documentclass[a4paper]{article}
\usepackage{listings}
\lstset{basicstyle=\ttfamily, columns=fullflexible, keepspaces=true}
\begin{document}
\begin{lstlisting}
<< SWAP DUP SIZE 
HEAD 1 - -> J vec N
<< 0 N FOR k vec k 1 
+ GET i NEG 2 * pi *
k * J * N 1 + / EXP 
* NEXT N 1 + -> LIST sum LIST
>> >>
\end{lstlisting}
\end{document}

在此处输入图片描述

手册listings这里

附录 JHP50G手册显示了 HP 关于以普通 7 位 ASCII 代码表示 HP50G 字符集上半部分的建议,但如果您想在 LaTeX 中显示它们,则用 UTF-8 输入它们并不太难。

但是如果你这样做,你需要找到一种ttfamily支持你需要的所有字符的字体。并且你需要使用一个可以直接处理 Unicode 的引擎。这是一个使用TeX Gyre Cursor和 的版本xelatex

\documentclass[a4paper]{article}
\usepackage{fontspec}
\setmonofont{TeX Gyre Cursor}
\usepackage{listings}
\lstset{basicstyle=\ttfamily, columns=fullflexible, keepspaces=true}
\begin{document}
\begin{lstlisting}
« SWAP DUP SIZE 
HEAD 1 - → J vec N
« 0 N FOR k vec k 1 
+ GET i NEG 2 * π *
k * J * N 1 + / EXP 
* NEXT N 1 + →LIST 
∑LIST » »
\end{lstlisting}
\end{document}

结果是:

在此处输入图片描述

在 Mac 上,我可以使用键盘查看器查找希腊字符的组合键,并且可以在“表情符号和符号查看器”工具中找到右箭头和尖括号字符。我相信其他平台也有类似的机制。

我认为您还可以使用“文学编程”功能来listings自动获取其中一些特殊字符,但我在手册中从未做到这一点。

答案2

此答案尝试重现屏幕截图。它使用lcd包,该包定义了一个扩展的字母数字字符集,每个字符都使用 5 x 7 矩阵中的点集构造。因此,字符由 35 位的二进制序列定义,以表示单元格是否有可见的点或为空。

屏幕截图显示了两种字符大小,上面两行比后面的代码小。下面一行将白色文本放在黑色背景上。这三行是使用宏创建的\textLCD,写法如下:

\textLCD[LCDcorr]{LCDcolumns}⟨delimchar⟩LCDtext ⟨delimchar⟩

其中,LCDcorr是相对于相邻文本的偏移量的校正,LCDcolumns是显示列数,delimchar是选择用来分隔的开始和结束的字符LCDtext

该脚本使用宏来设置\LCD,写法如下:

\LCD{LCDlines}{LCDcolumns}⟨delimchar⟩LCDtext ⟨delimchar⟩ ⟨delimchar⟩LCDtext ⟨delimchar⟩

其中LCDlines是块中的行数。

屏幕第 1 行使用引号。必须使用重新定义开头的引号,\DefineLCDchar以使其与结尾的引号匹配。

lcd包创建了预定义的特殊字符,例如 pi 和右箭头,它们被写在{}例如中{pi}。第 2 行中围绕 HOME 的花括号必须重新分配给另一个字符并使用 进行定义\DefineLCDchar才能在第 2 行中使用它们。我选择重新定义(),因为它们在脚本的任何地方都不需要。<<>>也被重新定义,因为它们是 5 像素高,而 <> 占据了整个 7 像素高度。<<和分别>>分配给^;

同时使用\textLCD\LCD会导致右边缘略微参差不齐。我通过将代码放在 中来隐藏参差不齐tcolorbox,并将colback设置为与屏幕显示相同的颜色。MWE 仍然显示我能找到的最接近的语法,以产生完全对齐的左边缘和右边缘,尽管使用 使这些设置变得多余tcolorbox

提供了两个示例。第一个示例是该软件包的“开箱即用”功能lcd。响应 ShreevatsaR 的评论,还可以收紧像素,使它们相邻。这是通过将水平间距更改\line(1,0){0.7}为并将垂直间距更改为 来实现的。\line(1,0){1.0}\linethickness{0.7\unitlength}\linethickness{1.0\unitlength}

在此处输入图片描述

这是 MWE:

\documentclass[a4paper]{article}
\usepackage[latin1]{inputenc}
\usepackage{lcd}
\usepackage{xcolor}
\usepackage[most]{tcolorbox}
\setlength\parindent{0.25pt}

% define the color of the display
\definecolor{background}{RGB}{185,202,187}
\tcbset{colframe=white,colback=background,sharp corners,left=0pt,right=0pt,top=0pt,bottom=0pt,width=7.4cm}

% redefine left quote
\DefineLCDchar{`}{01100010000010000000000000000000000} 
% make left curly bracket and use (, which is not required elsewhere
\DefineLCDchar{(}{00111010000100010000010000100000111} 
% make right curly bracket and use ), which is not required elsewhere
\DefineLCDchar{)}{11100000100001000001000100001011100} 
% make left <<
\DefineLCDchar{^}{00000001010101010100010100010100000}
% make right >>
\DefineLCDchar{;}{00000101000101000101010101010000000}

\setlength\LCDunitlength{0.5mm}

\begin{document}
\LCDnoframe
\LCDcolors{black}{background}

\textbf{Example 1}

\begin{tcolorbox}
\textLCD[-1]{33} |RAD R&Z HEX C= `X'|           \\[-2pt] % need redefined ` to match '
\textLCD{33}     |(HOME)|                       \\[-1pt] % () are written as curly
\LCD{8}{23}      |-----------------------|      \\[-1pt]              
                 |1: ^ SWAP DUP SIZE| 
                 |   HEAD 1 - {rarrow} J vec N|
                 |   ^ 0 N FOR k vec k 1| 
                 |   + GET i NEG 2 * {pi} *|
                 |   k * J * N 1 + {/} EXP| 
                 |   * NEXT N 1 + {rarrow}LIST|
                 |   {Sigma}LIST ; ;|         \\[-4pt]
\LCDcolors{white}{black}
\textLCD{33}    +GO1A|IOPAR|DFT4| DFT3| DFT2| DFT1+  % change the text delimiter to +
\end{tcolorbox}

% To reduce the pixelation, reduce the x,y spacing of the pixels

\makeatletter
\renewcommand*\@DrawLCDDot{%
    \put(\the\c@@LCDdotx,\the\c@@LCDdoty.35){\line(1,0){1.0}}} % was \line(1,0){0.7}
\makeatother
\makeatletter
\renewcommand*\@LCDstart{\unitlength\LCDunitlength
    \begin{picture}(\the\@tempcntb.7,\the\@tempcnta.7)(0,\the\c@@LCDlower)
    \color{\@LCDfr}
    \if@textLCD\advance\@tempcnta 2\fi
    \put(0,0){\fboxsep\z@\colorbox{\@LCDbg}{\@LCDbox(\the\@tempcntb.7,\the\@tempcnta.7){}}}
    \color{\@LCDfg}
    \linethickness{1.0\unitlength}} % was 0.7\unitlength
\makeatother

\bigskip

\textbf{Example 2}

\begin{tcolorbox}
    \textLCD[-1]{33} |RAD R&Z HEX C= `X'|           \\[-2pt] % need redefined ` to match '
    \textLCD{33}     |(HOME)|                       \\[-1pt] % () are written as curly
    \LCD{8}{23}      |-----------------------|      \\[-1pt]              
    |1: ^ SWAP DUP SIZE|                                     % use ^ for <<
    |   HEAD 1 - {rarrow} J vec N|
    |   ^ 0 N FOR k vec k 1| 
    |   + GET i NEG 2 * {pi} *|
    |   k * J * N 1 + {/} EXP| 
    |   * NEXT N 1 + {rarrow}LIST|
    |   {Sigma}LIST ; ;|         \\[-4pt]                    % use ; for >>
    \LCDcolors{white}{black}
    \textLCD{33}    +GO1A|IOPAR|DFT4| DFT3| DFT2| DFT1+  % change the text delimiter to +
\end{tcolorbox}

\end{document}

相关内容