Двоичные данные в TeX \special

Двоичные данные в TeX \special

Хочу спросить, могу ли я выводить двоичную информацию в \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 поддерживает произвольные двоичные данные внутри специальных команд (они же команды xxx1to xxx4). Однако существует соглашение, что данные являются текстом; на самом деле dvitypeвыдает ошибку или предупреждение, когда xxxкоманда содержит не-ASCII данные.

<код>dvitype</код>

Конечно, это может быть просто соглашением со времен написания DVItype (последнее обновление 1995 г.), и я не исследовал специальные DVI, созданные различными пакетами (или то, что XeTeX делает в своем .xdvформате). Так что вполне возможно, что вы можете иметь там двоичные данные и обойтись без этого — по крайней мере, в некоторых драйверах DVI, поскольку интерпретация специального полностью зависит от драйвера DVI. Но если вы пишете свой собственный драйвер DVI (что предполагается, если вы помещаете туда необычные специальные), то вы могли бы вместо этого записать двоичные данные в base64 или какой-то подобной кодировке ASCII-only, а затем заставить драйвер декодировать их в произвольные данные.

Связанный контент