-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstructions.tex
More file actions
503 lines (384 loc) · 22.7 KB
/
instructions.tex
File metadata and controls
503 lines (384 loc) · 22.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
\documentclass[a4paper]{article}
\usepackage[numbers]{natbib}
\usepackage{}
\usepackage{listings}
\usepackage[T1]{fontenc}
\usepackage[hidelinks]{hyperref}
\lstset{
columns=fullflexible,
basicstyle=\ttfamily,
frame=single,
breaklines=true,
upquote=true
}
\hyphenation{Game-scope}
\title{Arch Linux Post-Install}
\author{Wartybix}
\date{\today}
\begin{document}
\maketitle
These are some notes I have written for myself, for the next time I install Arch Linux.
\section{Using Pacman}
Install new packages with:
\begin{lstlisting}[escapechar=@]
# pacman -Syu @\underline{packagename}@
\end{lstlisting}
Passing the \lstinline|-Syu| flag updates all packages on the system, and is necessary to prevent any breakage from incompatible packages.
Check the manual page (\lstinline|man pacman|) for more information on what each of these
flags do.
Remove packages with:
\begin{lstlisting}[escapechar=@]
# pacman -Rs @\underline{packagename}@
\end{lstlisting}
This removes (\lstinline|-R|) the package, as well any of its dependencies (\lstinline|-s|) not needed by other packages.
\section{Bash Autocomplete}
On a fresh installation of Arch Linux, the terminal doesn't always auto-complete when pressing tab while inputting package names and such.
Install the \lstinline|bash-completion| package for this functionality (\lstinline|pacman -Syu bash-completion|).
\section{Installing Yay}
To make management of AUR packages easier, Yay should be installed.
On a fresh installation of Arch Linux, Git may not be installed --- in which case install it.
\begin{lstlisting}
# pacman -Syu git
\end{lstlisting}
Clone Yay's repository located at \url{https://aur.archlinux.org/yay.git}:
\begin{lstlisting}
$ git clone https://aur.archlinux.org/yay.git
\end{lstlisting}
Navigate into the new directory:
\begin{lstlisting}
$ cd yay
\end{lstlisting}
Install Yay:
\begin{lstlisting}
$ makepkg -si
\end{lstlisting}
Yay is now installed.
\section{Setting up Pacman cache auto-clean}
Pacman's cache of previous package versions will build up over time.
To clear this cache on a weekly basis, first install the \lstinline|pacman-contrib| package:
\begin{lstlisting}
# pacman -Syu pacman-contrib
\end{lstlisting}
Then, enable and start \lstinline|paccache.timer| \cite{paccache-timer}.
\begin{lstlisting}
# systemctl enable paccache.timer
# systemctl start paccache.timer
\end{lstlisting}
\section{Update Notifier}
This step is only helpful if using the GNOME desktop environment.
Get informed of updates for your system without needing to manually check yourself in the terminal.
To enable this functionality, install the Arch Linux Updates Indicator (\lstinline|arch-update@RaphaelRochet|) GNOME extension.
As per the extension's instructions, install the \lstinline|pacman-contrib| package to allow for the checking of updates \cite{arch-update-wiki}.
Disable the `Always visible' option in its settings to only show the update icon when new updates are available.
\subsection{Implementing with Yay}
By default, the extension only works with packages using Pacman.
Extend this functionality to Yay to allow the notifications and upgrades of new AUR package updates.
The following commands are as per the project's wiki \cite{arch-update-wiki}.
In `Advanced Settings' of the extension's settings, change `Command to check for package updates' to:
\begin{lstlisting}
/bin/sh -c "(/usr/bin/checkupdates; /usr/bin/yay -Qu --color never | sed 's/Get .*//') | sort -u -t' ' -k1,1"
\end{lstlisting}
And change `Command to update packages' to:
\begin{lstlisting}
kgx -e '/bin/sh -c "yay ; echo Done - Press enter to exit; read"'
\end{lstlisting}
\section{Package suggestions}
When running a command belonging to a package not installed on the system, it may be helpful to have Bash name these packages available in the repositories for the user to install.
This is more helpful than a more generic `command not found' message that instead causes the user to search online for information on what package needs to be installed to provide the command.
To enable this functionality, install the \lstinline|pkgfile| package.
Run the following:
\begin{lstlisting}
# pkgfile --update
\end{lstlisting}
Edit your \lstinline|.bashrc| file to include this line \cite{arch-command-not-found}:
\begin{lstlisting}
source /usr/share/doc/pkgfile/command-not-found.bash
\end{lstlisting}
\section{Setting up secure boot}
Thank you to `Walian' on YouTube for an easy-to-follow guide on enabling secure boot on Arch Linux (\url{https://www.youtube.com/watch?v=yU-SE7QX6WQ}).
I have written the following instructions from this video here in order to preserve them, and to allow the following of these instructions textually.
Reboot into your motherboard's BIOS, either by entering your motherboard's assigned `BIOS key' on boot, or by entering the following in a Linux terminal:
\begin{lstlisting}
$ systemctl reboot --firmware-setup
\end{lstlisting}
In the BIOS, disable secure boot (if not disabled already), and reset your secure boot keys.
Save changes and reboot.
Install the \lstinline|sbctl| package:
\begin{lstlisting}
# pacman -Syu sbctl
\end{lstlisting}
Create secure boot keys with:
\begin{lstlisting}
# sbctl create-keys
\end{lstlisting}
Enrol the keys with your system with:
\begin{lstlisting}
# sbctl enroll-keys -m
\end{lstlisting}
Sign the bootloader with:
\begin{lstlisting}
# sbctl sign -s -o /usr/lib/systemd/boot/efi/systemd-bootx64.efi.signed /usr/lib/systemd/boot/efi/systemd-bootx64.efi
\end{lstlisting}
Find locations of kernel images with:
\begin{lstlisting}
# sbctl verify
\end{lstlisting}
Common images you may see are:
\begin{itemize}
\item \lstinline|/boot/vmlinuz-linux|
\item \lstinline|/boot/vmlinuz-linux-lts|
\item \lstinline|/efi/EFI/Linux/arch-linux.efi|
\end{itemize}
Although this list is not exhaustive --- in general, just sign everything \lstinline|sbctl verify| marks as outstanding.
Sign each of these images with:
\begin{lstlisting}[escapechar=@]
# sbctl sign -s @\underline{image-path}@
\end{lstlisting}
Reinstall the bootloader:
\begin{lstlisting}
# bootctl install
\end{lstlisting}
Ensure all files have been signed correctly by running \lstinline|sbctl verify| again.
If everything is signed and there are no issues, reboot back into the BIOS and enable secure boot.
Reboot back into Arch Linux, and enter the following in a terminal to check secure boot status:
\begin{lstlisting}
$ sbctl status
\end{lstlisting}
Setup mode should be \emph{disabled} and secure boot \emph{enabled}.
Now, secure boot should be enabled, and Pacman should re-sign the kernel images when installing new packages.
\section{Enabling Wayland in Electron \& Chromium}
It is possible to enable native Wayland rendering --- rather than using Xwayland --- in Electron apps like Code and Discord, as well as in Chromium.
To enable Wayland for Electron apps, create a configuration file in your home directory inside \lstinline|~/.config/environment.d/|.
You may need to create the \lstinline|environment.d| directory with \lstinline|mkdir|.
This file can be named anything of the user's choosing --- for example, \lstinline|electron-wayland.conf|.
Open the file and add \cite{arch-wiki-wayland}:
\begin{lstlisting}
ELECTRON_OZONE_PLATFORM_HINT=auto
\end{lstlisting}
Reboot your system.
Electron apps should now run in Wayland.
To enable Wayland for Chromium, open Chromium and navigate to \url{chrome://flags/}.
This will open the `experimental features' list.
Search for `Preferred Ozone platform', and set it to either `Auto' or `Wayland'.
This change also affects Chromium web-apps you have installed.
You can test if any window is running in Xwayland by using \lstinline|xeyes|.
Run
\begin{lstlisting}
$ xeyes
\end{lstlisting}
in a terminal.
If the eyes follow the cursor as it moves across an application window, it is running in Xwayland.
If the eyes do not follow the cursor, the application is running in native Wayland.
\section{Xwayland fractional scaling}
When using fractional scaling on GNOME, Xwayland apps can appear blurry, as Mutter stretches their viewports to match the scaling, resulting in pixelation.
One solution is to avoid using Xwayland altogether, ensuring programs run in native Wayland, as discussed in the previous section.
However, this isn't possible for \emph{every} app --- like Steam and JetBrains IDEs such as Android Studio (at time of writing), as well as legacy applications.
Therefore, it's likely a user will have to interact with Xwayland in one way or another.
As of GNOME 47, a patch that allows Xwayland apps to scale themselves has been merged with upstream Mutter.
If not already installed, install dconf Editor:
\begin{lstlisting}
# pacman -Syu dconf-editor
\end{lstlisting}
Open dconf Editor, and navigate to:
\begin{lstlisting}
/org/gnome/mutter/experimental-features
\end{lstlisting}
Enable the \lstinline|xwayland-native-scaling| flag, along with the \lstinline|scale-monitor-framebuffer| flag, if not already enabled.
Log out and log back in, and ensure the desired scaling is selected in the display settings.
Xwayland apps should no longer be blurry when using fractional scaling.
If Xwayland apps are still blurry, try performing a full reboot instead.
\subsection{Side effects}
As this patch is experimental, using it may cause minor GUI glitches, like `click-passthrough', where clicks don't register on a window, and instead the click goes `underneath' it.
This frequently affects already-open Xwayland windows immediately after changing display scaling settings in my experience.
To remedy, simply close the affected program (with Alt+F4 if the `close' button can't be clicked) and re-open it.
\subsection{Steam scaling fix}
After applying this patch, I found Steam to be scaled incorrectly (too small), contrary to other Xwayland clients.
I assume this could affect other users too.
If Steam is scaled incorrectly, navigate to \lstinline|~/.config/environment.d|.
Create a new configuration file, e.g., \lstinline|steam-scaling.conf|, and inside put:
\begin{lstlisting}
STEAM_FORCE_DESKTOPUI_SCALING=2
\end{lstlisting}
This environment variable --- after rebooting --- should double Steam's scaling, hopefully matching the scale of other applications.
\section{Enabling Bluetooth}
Install the \lstinline|bluez| and \lstinline|bluez-utils| packages:
\begin{lstlisting}
# pacman -Syu bluez bluez-utils
\end{lstlisting}
Then enable and start the Bluetooth service:
\begin{lstlisting}
# systemctl enable bluetooth.service
# systemctl start bluetooth.service
\end{lstlisting}
\section{Nano linting}
Enable linting in Nano by creating a file at \lstinline|~/.nanorc|.
In this file, add the following:
\begin{lstlisting}
include /usr/share/nano/*.nanorc
\end{lstlisting}
This enables linting with all of Nano's supported file types.
To enable Nano linting for all users (including the root user), add this line to \lstinline|/etc/nanorc| instead.
\section{Gaming on Linux}
\subsection{Using Xbox game controllers}
The default \lstinline|xpad| drivers for Linux aren't too good --- for example, there are issues with the latency of controller haptics.
Instead, install \lstinline|linux-headers| package with Pacman.
Then install \lstinline|xpadneo| with Yay.
\subsubsection{Rumble attenuation}
The \lstinline|xpadneo| driver allows the use of rumble motors in the Xbox controller's triggers --- this is a feature unused in most games even when running Windows.
The driver allows the triggers to rumble at the same time as other haptic motors in the controller when being pressed.
However, the default trigger rumble attenuation might be a bit too strong to the point of distraction.
This strength of the trigger rumble can be configured in real time by writing \lstinline|0,n| to a file at \lstinline|/sys/module/hid_xpadneo/parameters/rumble_attenuation|, \cite{xpadneo-troubleshooting}.
\lstinline|n| is a value from 0 (the highest strength) to 100 (the lowest strength / off).
I recommend a value of 70 (i.e., 30\% rumble strength) for a subtle-yet-noticeable haptic effect on the triggers --- your preferences may differ, however.
To make this trigger rumble attention setting apply at loading time, enter the following: \cite{xpadneo-troubleshooting}
\begin{lstlisting}
$ echo "options hid_xpadneo rumble_attenuation=0,70" | sudo tee /etc/modprobe.d/99-xpadneo-bluetooth.conf
\end{lstlisting}
Change the \lstinline|rumble_attenuation=0,70| value to your preferred value.
To make this file immutable (so that the system doesn't delete it), run:
\begin{lstlisting}
# chattr +i /etc/modprobe.d/99-xpadneo-bluetooth.conf
\end{lstlisting}
\subsubsection{Improve latency on Xbox Series X|S controllers}
Users may experience high latency or missed inputs when using this driver on Microsoft's Xbox Series X|S controllers \cite{xpadneo-troubleshooting}. In this case, the developer recommends editing the Bluetooth configuration file, located at \lstinline|/etc/bluetooth/main.conf|. Navigate down to the \lstinline|[LE]| section of the configuration file and look for the following settings, uncomment and set them as \cite{xpadneo-troubleshooting}:
\begin{itemize}
\item \lstinline|MinConnectionInterval=7|
\item \lstinline|MaxConnectionInterval=9|
\item \lstinline|ConnectionLatency=0|
\end{itemize}
Restart Bluetooth by running:
\begin{lstlisting}
# systemctl restart bluetooth.service
\end{lstlisting}
or by rebooting your PC.
View the citation used in this section (and navigate to the URL) to see the full \lstinline|xpadneo| troubleshooting page.
The full page explains various other issues, and goes into more detail (such as the potential negative side effects of editing the above values in the Bluetooth configuration file).
This document is only a basic guide, and further reading is required to actually understand what you are doing.
\subsection{Feral GameMode}
Install Feral GameMode for CPU optimizations when playing games on Linux.
Install the \lstinline|gamemode| and \lstinline|lib32-gamemode| packages \cite{arch-wiki-gamemode}:
\begin{lstlisting}
# pacman -Syu gamemode lib32-gamemode
\end{lstlisting}
Add yourself to the \lstinline|gamemode| user group to give Feral GameMode's user daemon the rights to change the CPU governor \cite{arch-wiki-gamemode}.
\begin{lstlisting}[escapechar=@]
# usermod -aG gamemode @\underline{exampleuser}@
\end{lstlisting}
\subsection{Gamescope}
Gamescope is a compositor that allows for the customization of how games are output to the display.
Gamescope is especially useful when using fractional scaling in Wayland, as, without it, games detect a ``native'' resolution far beyond the capabilities of the monitor due to the scaling.
In this case the user must either use the `supersampled' resolution --- forcing their GPU to work harder than necessary, potentially resulting in a lower frame rate --- or lower the in-game resolution to that of their monitor's (if even listed).
This results in a blurry and often glitchy image on Wayland.
Gamescope alleviates this issue as the user can simply enter their resolution with Gamescope's \lstinline|-H| and \lstinline|-W| flags.
To use Gamescope, first install it with the package manager:
\begin{lstlisting}
# pacman -Syu gamescope
\end{lstlisting}
Gamescope can then be used as part of games' launch options in the user's library.
Here is my recommended launch options to open most games:
\begin{lstlisting}[escapechar=@]
gamemoderun gamescope -H @\underline{monitor-height}@ -W @\underline{monitor-width}@ -r @\underline{monitor-refresh-rate}@ -f -e --force-grab-cursor -g %command%
\end{lstlisting}
\lstinline|gamemoderun| starts the Feral GameMode daemon as introduced last section.
\lstinline|gamescope| starts a Gamescope session of whatever \lstinline|%command%| is (i.e., opening a particular game).
Between \lstinline|gamescope| and \lstinline|%command%| in the launch options are \lstinline|gamescope|'s arguments:
\begin{itemize}
\item \lstinline|-H| takes the monitor's height in pixels.
\item \lstinline|-W| takes the monitor's width in pixels.
\item \lstinline|-r| takes the monitor's refresh rate in Hz.
\item \lstinline|-f| opens a full-screen window.
\begin{description}
\item[Note:] Sometimes this flag doesn't work, and Libdecor decorations on your Gamescope window and elements of your desktop environment will still be visible regardless. Use Gamescope's super + F keyboard shortcut to enter full-screen when this happens.
\end{description}
\item \lstinline|-e| adds Steam overlay integration. Some Steam games break when using Gamescope without this \cite{arch-wiki-gamescope}.
\item \lstinline|--force-grab-cursor| Allows the window inside Gamescope to grab the mouse cursor. Allows moving a camera with the mouse without any limitations as one would expect, without the mouse (invisibly) hitting the edge of the display causing the camera movement to be limited.
\item \lstinline|-g| Grabs the keyboard. Useful as Gamescope won't recognize its keyboard shortcuts (like super + F to toggle full-screen) without it.
\begin{description}
\item[Note:] Your desktop environment's shortcut for toggling full-screen does \emph{not} achieve the same functionality as Gamescope's own shortcut. Your desktop environment's shortcut will stretch the output of Gamescope, making the image slightly blurry/pixelated. However, Gamescope's own shortcut keeps the image intact. This is why it is important to pass the \lstinline|-g| flag to inhibit desktop keyboard shortcuts.
\end{description}
\end{itemize}
\subsubsection{Wayland/SDL Backend}
\begin{description}
\item[Note:] Read this section if you are noticing choppy frame-rates or micro-stutter with Gamescope.
\end{description}
Adding \lstinline|--backend sdl| as an argument to Gamescope forces the use of SDL2 instead of automatically picking the Wayland backend.
I have personally had issues with micro-stutter and Vsync using the Wayland backend in the past.
\lstinline|mangoapp| was reporting a steady, high frame-rate when using the Wayland backend, yet my eyes saw a very jittery image, particularly when using Vsync in game.
After doubting my sanity for a few hours, I realized that switching to SDL2 (using the above flag) fixed the issue and the image was smooth again.
I assume there's some kind of weirdness going on between Gamescope's nested compositor and the physical monitor, which is why Gamescope's in-built \lstinline|mangoapp| reported a flawless smooth frame rate, but what was output was a visually jittery mess.
However, after updates to Gamescope, I no longer have this issue with the Wayland backend, and it is as smooth as using SDL.
So, ensure you try using the default auto (Wayland, if on Wayland) backend first before switching to SDL --- especially as SDL has problems of its own in Gamescope.
For example, Gamescope sometimes doesn't draw a window when opening a game with the SDL backend, particularly when games have their own launchers that display a `launching game…' pop-up and such before opening the actual game itself.
\section{Using FAT32 and NTFS storage on Linux}
Install the \lstinline|dosfstools| and \lstinline|ntfsprogs| packages for compatibility with FAT32 and NTFS systems respectively.
\section{Power saving}
Install the \lstinline|tlp| and \lstinline|tlp-rdw| packages to enable power-saving optimizations to extend battery life on Arch Linux \cite{tlp-installation}.
Start and enable \lstinline|tlp.service|:
\begin{lstlisting}
# systemctl enable tlp.service
# systemctl start tlp.service
\end{lstlisting}
\section{Intel CPU cooling}
Install the \lstinline|thermald| package to prevent Intel CPUs from overheating.
This daemon monitors the CPU temperature, and activates cooling measures when it reaches above a certain threshold \cite{arch-wiki-thermald}.
After this is installed, start and enable \lstinline|thermald.service|:
\begin{lstlisting}
# systemctl enable thermald.service
# systemctl start thermald.service
\end{lstlisting}
\section{Ctrl+Backspace functionality}
After installing Arch Linux via \lstinline|archinstall|, there may be some issues with using \lstinline|Ctrl + Backspace| to delete whole words in many system programs (e.g., in GNOME Text Editor).
The issue lies in \lstinline|/etc/vconsole.conf|.
Open the file in your chosen text editor and remove or comment out the following line:
\begin{lstlisting}
XKBOPTIONS=terminate:ctrl_alt_bksp
\end{lstlisting}
View the configuration file you may have at \lstinline|/etc/X11/xorg.conf.d/00-keyboard.conf|.
The problematic line is:
\begin{lstlisting}
...
...
Option "XkbOptions" "terminate:ctrl_alt_bksp"
...
\end{lstlisting}
This line prevents the use of \lstinline|Ctrl+Backspace| to delete words.
However, \emph{don't} edit this file directly, as per its comments.
Instead, use the \lstinline|localectl| command.
Take a note of the \lstinline|XkbLayout| and \lstinline|XkbModel| values in \lstinline|00-keyboard.conf|.
For example, mine are \lstinline|gb| and \lstinline|pc105| respectively:
\begin{lstlisting}
...
...
Option "XkbLayout" "gb"
Option "XkbModel" "pc105"
...
...
\end{lstlisting}
Enter the following into the terminal, replacing \lstinline|XkbLayout-value| and \lstinline|XkbModel-value| with your values in \lstinline|00-keyboard.conf| for \lstinline|XkbLayout| and \lstinline|XkbModel| respectively:
\begin{lstlisting}[escapechar=@]
$ localectl set-x11-keymap @\underline{XkbLayout-value}@ @\underline{XkbModel-value}@
\end{lstlisting}
View \lstinline|00-keyboard.conf| again, and ensure that `\lstinline|terminate:ctrl_alt_bksp|' no longer appears in the file.
Finally, start GNOME Tweaks, and navigate to `Keyboard', and then `Additional Layout Options'.
Uncheck the `Ctrl+Alt+Backspace' option under `Key sequence to kill the X server'.
Whole-word backspace functionality should be restored, and should hopefully persist upon next reboot.
\section{Hardware clock synchronization}
When duel booting with Windows, a user may notice the time is incorrect (offset by a number of hours) on their Windows partition.
This is due to the different ways the two operating systems interpret the hardware (i.e., CMOS) clock.
Set Linux to synchronise the hardware clock with the local time (rather than UTC time, as is default) with the following command \cite{wrong-time-duel-boot}:
\begin{lstlisting}
$ timedatectl set-local-rtc 1
\end{lstlisting}
\section{Boot Screen Timer}
To change how long the boot menu stays open before the default entry is automatically selected, use the following command:
\begin{lstlisting}[escapechar=@]
# bootctl set-timeout @\underline{n}@
\end{lstlisting}
where \lstinline|n| is the time in seconds the boot screen stays visible.
The timeout can be set to 0, which will hide boot the screen altogether, and immediately boot to the default entry when powering on the computer.
The user can, however, press the space bar as the computer is booting (much like with the DEL key etc. to enter the BIOS) to access the boot menu.
% TODO Add section for fwupd
% TODO Add section for Plymouth
\bibliographystyle{IEEEtranN}
\bibliography{refs}
\end{document}