![如何将 HP 50G 中的代码转录到 LaTeX 中](https://linux22.com/image/363066/%E5%A6%82%E4%BD%95%E5%B0%86%20HP%2050G%20%E4%B8%AD%E7%9A%84%E4%BB%A3%E7%A0%81%E8%BD%AC%E5%BD%95%E5%88%B0%20LaTeX%20%E4%B8%AD.png)
答案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}