
Хочу спросить, могу ли я выводить двоичную информацию в \special
? Если это возможно, как мне поместить двоичный код в исходный код TeX? В C/C++, например, \0
можно использовать для получения байта, 00000000
так что может быть эквивалентом для TeX?
решение1
Если вы имеете в виду, могу ли я ввести \special
с последующим чем-то, в .tex
исходный файл, чтобы получить двоичные данные в файл DVI, то ответ — нет (но см. ниже). Это потому, что в TeX \special
нет ничего особенного: это просто примитивная команда (вроде \def
или \write
), и она просто записывает токены, которые указаны внутри \special{...}
, при этом расширяя их и так далее (вроде \edef
или \xdef
). Поскольку сложно получить произвольные двоичные данные в списке токенов TeX, вы не можете записать их в файл DVI. (Однако, см.этот ответчто указывает на способ, которым это может быть возможно (именно возможно, а не просто!) с использованием pdflatex -8bit
.)
Соответствующие разделы из программы TeX (см. ее сtexdoc tex
), показывая, что \special
использует show_token_list
и т. д.:
Даже если бы вы могли записать двоичные данные из источника TeX, сработало бы это? Сам формат DVI поддерживает произвольные двоичные данные внутри специальных команд (они же команды xxx1
to xxx4
). Однако существует соглашение, что данные являются текстом; на самом деле dvitype
выдает ошибку или предупреждение, когда xxx
команда содержит не-ASCII данные.
Конечно, это может быть просто соглашением со времен написания DVItype (последнее обновление 1995 г.), и я не исследовал специальные DVI, созданные различными пакетами (или то, что XeTeX делает в своем .xdv
формате). Так что вполне возможно, что вы можете иметь там двоичные данные и обойтись без этого — по крайней мере, в некоторых драйверах DVI, поскольку интерпретация специального полностью зависит от драйвера DVI. Но если вы пишете свой собственный драйвер DVI (что предполагается, если вы помещаете туда необычные специальные), то вы могли бы вместо этого записать двоичные данные в base64 или какой-то подобной кодировке ASCII-only, а затем заставить драйвер декодировать их в произвольные данные.