DVI (ang. device independent) – format pliku wynikowego w programie wydawniczym TeX. W przeciwieństwie do plików ze znacznikami TeX, pliki DVI nie są przeznaczone do czytania przez użytkownika; zawierają dane binarne opisujące wizualny układ dokumentu w sposób niezależny od specyficznego formatu graficznego, monitora czy drukarki.
Pliki DVI są przetwarzane przez sterownik DVI (DVI driver) na format graficzny akceptowany przez urządzenia wyjściowe. Dla przykładu, większość pakietów TeX zawiera program do podglądu plików DVI na monitorze komputera – program taki jest sterownikiem (ang. driver). Sterowniki są też używane do przetworzenia DVI na popularne formaty dokumentów (np. PostScript, PDF, HTML) i do drukowania. Wikipedie używają sterownika PNG do generowania plików graficznych z matematycznych formuł używanych w artykułach.
Pliki DVI opisują dwa rodzaje monochromatycznych obiektów graficznych: znaki oraz wypełnione prostokąty. Jednakże istnieje możliwość osadzania w DVI dowolnych danych binarnych, za interpretację których odpowiada sterownik; w ten sposób na przykład dodawane są kolory do tekstu, informacje o odnośnikach (wykorzystywane przy tworzeniu dokumentów PDF i HTML), fragmenty kodu Postscriptu i inne. W systemie TeX istnieje specjalna instrukcja pozwalająca autorowi umieszczać tego typu dane – nie są potrzebne żadne dodatkowe programy.
DVI nie jest szyfrowany i znaczniki TeX mogą być przynajmniej częściowo odtworzone z plików DVI za pomocą inżynierii wstecznej, jednak proces ten nie daje gwarancji idealnie wiernego odtworzenia pierwotnych znaczników, zwłaszcza gdy użyte zostały rozszerzenia TeX wysokiego poziomu, jak LaTeX. Wydawcy, którzy opierają się na systemach TeX, oprócz DVI wymagają zwykle także dostarczania plików źródłowych ze znacznikami.
Format został zaprojektowany tak, aby zarówno tworzenie plików jak i odczyt były łatwe do zaprogramowania, samo zaś tworzenie obrazu polega na interpretacji poleceń bardzo prostej maszyny wirtualnej wykonującej działania na liczbach całkowitych. Rozmiar pliku DVI zawsze jest wielokrotnością 4 bajtów.
Zdefiniowane jest 25 instrukcji, z czego większość występuje w kilku formach, w zależności od rozmiaru argumentu liczbowego. Instrukcje są zakodowane w jednym bajcie, natomiast liczby mogą być 1-, 2-, 3- i 4-bajtowe (zawsze zapisywane w porządku big endian, jeśli ujemne – zapisane w kodzie uzupełnień do 2).
Najprostszy sterownik DVI wymaga niewielkiej liczby struktur danych:
Aktualne parametry maszyny to 6 liczb:
fnt_def
lista argumentów – definicja fontu – sterownik ładuje wskazany font i przypisuje mu identyfikator liczbowyfnt_num
identyfikator – ustawia bieżący font (podawany jest identyfikator uprzednio zdefiniowanego fontu)put_char
numer znaku – stawia na pozycji (H,V) znak z bieżącego fontu; ponieważ numer może być 32-bitową liczbą naturalną, więc liczba różnych znaków w jednym foncie jest ograniczona do 4 miliardówset_char
numer znaku – jw., dodatkowo przesuwa w prawo bieżący punkt o szerokość postawionego znakuput_rule
wysokość, szerokość – wypełnia prostokąt o wskazanych wymiarach na pozycji (H,V)set_rule
wysokość, szerokość – jw., dodatkowo przesuwa w prawo bieżący punkt o szerokość prostokątaxxx
liczba bajtów, dane binarne – dodatkowe dane, których interpretacja zależy od sterownika DVI (ostatecznie mogą zostać całkowicie zignorowane)right
liczba – dodaje do H liczbęw0
– dodaje do H parametr Wx0
– dodaje do H parametr Xw
liczba – ustawia nową wartość W, dodaje ją również do Hx
liczba – ustawia nową wartość X, dodaje ją również do Hdown
liczba – dodaje do V liczbęy0
– dodaje do V parametr Yz0
– dodaje do V parametr Zy
liczba – ustawia nową wartość Y, dodaje ją również do Vz
liczba – ustawia nową wartość Z, dodaje ją również do Vpush
– zapamiętuje parametry na stosiepop
– odtwarza parametry ze stosubop
– znacznik początku strony (stos jest pusty, wszystkie parametry są zerowane, nie ma ustawionego fontu)eop
– znacznik końca stronynop
– nic nie robipre
– preambuła dokumentu, w której podawane są: jednostka strony, współczynnik powiększenia oraz komentarzpost
– epilog dokumentu; za tym znacznikiem znajduje się lista wszystkich fontów zdefiniowanych w całym dokumencie – dzięki temu interpreter może od razu załadować je wszystkie i ewentualnie poinformować użytkownika o brakujących fontach, bez konieczności przetwarzania całego dokumentupost_post
– znacznik końca listy fontów za znacznikiem post