Xournal-Plugins für Studierende

Plugins, die ich für die Verwendung von Xournal zum Lernen geschrieben habe

#Lua#Projekte

Xournal

Xournal++ ist ein Programm zum handschriftlichen Notieren, das für PC und Mobilgeräte verfügbar ist. Ich benutze es gerne zum Annotieren von PDFs und Vorlesungsfolien, zum Erledigen von schriftlichen Aufgaben oder Matheaufgaben und zum Durchführen von Probeklausuren. Dabei habe ich jedoch festgestellt, dass mir einige Funktionen fehlen, die ich gerne in Xournal sehen würde. Glücklicherweise bietet Xournal eine Schnittstelle zum Schreiben von Plugins in Lua und macht es einfach, diese zu installieren und zu verwenden. Xournal ist auch Open Source, aber bisher reicht mir die Plugin-Schnittstelle für meine Zwecke aus.

Meine Plugins

Hier sind die Plugins, die ich für mich selbst geschrieben habe und immer noch verwende:

Batch Toggle Grid

Xournal ermöglicht es Ihnen, den Hintergrund Ihres PDFs zu ändern, zum Beispiel zu kariertem oder liniertem Papier. Zum Lernen verwende ich entweder kariertes oder leeres Papier. Manchmal möchte ich zwischen diesen beiden wechseln. Allerdings habe ich bisher nur eine Möglichkeit gefunden, den Hintergrund einer Seite nach der anderen zu ändern, anstatt aller Seiten meines Dokuments. Mit meinem Plugin kann ich das jetzt tun.

-- Register all Toolbar actions and intialize all UI stuff function initUi() ref = app.registerUi({["menu"] = "Batch Toggle Grid", ["callback"] = "exampleCallback", ["accelerator"] = "<Control>b"}); print("Example plugin registered\n"); end local toggleState = false -- Callback if the menu item is executed function exampleCallback() --- result = app.msgbox("Test123", {[1] = "Yes", [2] = "No"}); --- print("result = " .. result) local docStructure = app.getDocumentStructure() local numPages = #docStructure["pages"] local page = docStructure["currentPage"] local background = "a" if toggleState == true then background = "graph"; else background = "plain"; end toggleState = not toggleState for i=1, numPages do app.setCurrentPage(i) app.changeCurrentPageBackground(background); end app.setCurrentPage(page) --- result = app.msgbox(app.getStrokes(), {[1] = "Yes", [2] = "No"}); end

Batch Horizontal

Das Gleiche gilt für das Drehen der Seite um 180 Grad. Manchmal benötige ich mehr horizontalen Platz zum Schreiben, habe aber ein hochformatiges Dokument erstellt. Wenn ich meine Seiten um 90 Grad drehen möchte, muss ich dies für jede Seite tun. Hier kommt mein Plugin ins Spiel.

-- Register all Toolbar actions and intialize all UI stuff function initUi() ref = app.registerUi({["menu"] = "Batch Horizontal", ["callback"] = "exampleCallback", ["accelerator"] = "<Control>t"}); end -- Callback if the menu item is executed function exampleCallback() --- result = app.msgbox("Test123", {[1] = "Yes", [2] = "No"}); --- print("result = " .. result) local docStructure = app.getDocumentStructure() local numPages = #docStructure["pages"] local page = docStructure["currentPage"] local width = docStructure["pages"][page]["pageWidth"] local height = docStructure["pages"][page]["pageHeight"] for i=1, numPages do app.setCurrentPage(i) app.setPageSize(height, width) end app.setCurrentPage(page) -- app.uiAction({["action"]="ACTION_TOOL_SELECT_RECT"}) --- result = app.msgbox(app.getStrokes(), {[1] = "Yes", [2] = "No"}); end

Page Progress Plugin

Lernen kann mühsam sein, besonders wenn Sie alle Ihre Vorlesungsfolien oder Arbeitsblätter für ein Fach zusammengeführt haben und versuchen, sich durch ein tausendseitiges Dokument zu kämpfen. Es ist nützlich zu sehen, wie weit Sie gekommen sind und wie viel Fortschritt Sie im Dokument gemacht haben. Deshalb habe ich ein Plugin geschrieben, das den Prozentsatz der Folien berechnet, die Sie bereits durchgescrollt haben.

-- Register all Toolbar actions and intialize all UI stuff function initUi() print("Hello from Example: Plugin initUi called\n"); ref = app.registerUi({["menu"] = "Print Progress", ["callback"] = "printProgress", ["accelerator"] = "<Control>l"}); print("Menu reference:"); end local filename = ".xppbm" -- Callback if the menu item is executed function printProgress() --- print("result = " .. result) local docStructure = app.getDocumentStructure() local numPages = #docStructure["pages"] local page = docStructure["currentPage"] result = app.msgbox("Page " .. tostring(page) .. "/" .. tostring(numPages) .. ", " .. tostring((page/numPages)*100) .."%", {[1] = "Ok"}); end

Bookmark Pages

Ich bin mir nicht sicher, ob dies ein Fehler oder beabsichtigtes Verhalten ist, aber auf meinem Gerät merkt sich Xournal nicht die aktuelle Seite, wenn ich ein Dokument schließe und wieder öffne. (Das ist sehr ärgerlich bei besagten langen Dokumenten.) Ich habe ein Plugin geschrieben, mit dem Sie die aktuelle Seite als Lesezeichen setzen und zu ihr springen können, auch nach dem erneuten Öffnen des Dokuments.

-- Register all Toolbar actions and intialize all UI stuff function initUi() ref = app.registerUi({["menu"] = "Save Current Page", ["callback"] = "onW", ["accelerator"] = "<Control>w"}); ref = app.registerUi({["menu"] = "Go To Bookmarked Page", ["callback"] = "onI", ["accelerator"] = "<Control>i"}); end local filename = ".xppbm" -- Callback if the menu item is executed function exampleCallback() result = app.msgbox("Test123", {[1] = "Yes", [2] = "No"}); --- print("result = " .. result) local docStructure = app.getDocumentStructure() local numPages = #docStructure["pages"] local page = docStructure["currentPage"] while( true ) do os.execute("timeout " .. tonumber(3)) --result = app.msgbox("Hallo!", {[1] = "Yes", [2] = "No"}); end saveCurrentPage() scrollToSavedPage() end function onW() local docStructure = app.getDocumentStructure() if docStructure["currentPage"]~=1 then saveCurrentPage() else scrollToSavedPage() end end function onI() local filereader, err = (io.open(filename, "r")) filereader:close() if filereader then scrollToSavedPage() else saveCurrentPage() end end function scrollToSavedPage() local filereader, err = (io.open(filename, "r")) if filereader then local t = filereader:read("*all") local loadedpagenumber = tonumber(t) app.scrollToPage(loadedpagenumber) end filereader:close() end function saveCurrentPage() local docStructure = app.getDocumentStructure() local f, err = (io.open(filename, "w")) local page = docStructure["currentPage"] f:write(tostring(page)) f:close() end

Kommentare

Noch Fragen?